在VB中调用动态连接库

出处:www.examlink.com 作者:小罗 日期:2007年01月24日 14时23分

  NULLAsAny或ByValNothing或

  ByValvariableAsLongByVal0&或VBNullString

  SHORTByValvariableAsInteger结果为Integer类型的表达式

  VOIDSubprocedure不可用

  WORDByValvariableAsInteger结果为Integer类型的表达式

  WPARAMByValvariableAsLong结果为Long类型的表达式

  5、VB中进行32位动态库的声明时,函数名是大小写敏感的。在获得了需要的动态连接库之后,就可以在VB中进行调用了。但是,由于VB不能验证应用程序传递到动态连接库中的参数值是否正确,因此VB程序中大量的API调用可能会降低整个应用程序的稳定性,也会增加以后维护的难度。所以,决定在VB程序中直接调用API函数时要慎重,但适当的使用API调用确实能够有效地提高VB程序的性能。这之间的平衡需要编程人员根据实际情况来掌握。下面就具体介绍一下在VB中调用API函数时需要做的工作。

  要声明一个DLL过程,首先需要在代码窗口的'通用(General)'部分增加一个Declare语句。如果该过程返回一个值,应将其声明为Function:

  DeclareFunctionpublicnameLib'libname'[Alias'alias'][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]。。。])]AsType

  如果过程没有返回值,可将其声明为Sub:

  DeclareSubpublicnameLib'libname'[Alias'alias'][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]。。。])]

  缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。在其它类型的模块中定义的DLL过程则是模块私有的,必须在它们前面声明Private关键字,以示区分。下面分别介绍声明语句的各个组成部分。

  (一)、指定动态库:

  Declare语句中的Lib子句用来告诉VisualBasic如何找到包含过程的。dll文件。如果引用的过程属于Windows核心库(User32、Kernel32或GDI32),则可以不包含文件扩展名,如:

  DeclareFunctionGetTickCountLib'kernel32'Alias'GetTickCount'()AsLong

  对于其它动态连接库,可以在Lib子句指定文件的路径:

  DeclareFunctionlzCopyLib'c:\windows\lzexpand。dll'_

  (ByValSAsInteger,ByValDAsInteger)AsLong

  如果未指定libname的路径,VisualBasic将按照下列顺序查找该文件:

  ①。exe文件所在的目录

  ②当前目录

  ③Windows系统目录

  ④Windows目录

  ⑤Path环境变量中的目录

  下表中列出了常用的操作系统环境库文件。

  动态链接库描述

  Advapi32。dll高级API服务,支持大量的API(其中包括许多安全与注册方面的调用)

  Comdlg32。dll通用对话框API库

  Gdi32。dll图形设备接口API库

  Kernel32。dllWindows32位核心的API支持

  Lz32。dll32位压缩例程

  Mpr。dll多接口路由器库

  Netapi32。dll32位网络API库

  Shell32。dll32位ShellAPI库

  User32。dll用户接口例程库

  Version。dll版本库

  Winmm。dllWindows多媒体库

  Winspool。drv后台打印接口,包含后台打印API调用。

  对于Windows的系统API函数,可以利用VB提供的工具APIViewer查找某一函数及其相关数据结构和常数的声明,并复制到自己的程序中。

  (二)、使用别名:

  Declare语句中的Alias子句是一个可选的部分,用户可以通过它所标识的别名对动态库中的函数进行引用。例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll。dll中最初的名字是MyFunctionX。

  PrivateDeclareFunctionMyFunctionLib'Mydll。dll'_

  Alias'MyFunctionX'()AsLong

  需要注意的是,Alias子句中的函数名是大小写敏感的,也就是说,必须与函数在生成时的声明(如在C源文件中的声明)一致。这是因为32位动态库与16位动态库不同,其中的函数名是区分大小写的。同样道理,如果没有使用Alias子句,那么在Function(或Sub)后的函数名也是区分大小写的。

  通常在以下几种情况时需要使用Alias子句:

  A。处理使用字符串的系统WindowsAPI过程

  如果调用的系统WindowsAPI过程要使用字符串,那么声明语句中必须增加一个Alias子句,以指定正确的字符集。包含字符串的系统WindowsAPI函数实际有两种格式:ANSI和Unicode(关于ANSI和Unicode两种字符集的区别将在后面详细阐述)。因此,在Windows头文件中,每个包含字符串的函数都同时有ANSI版本和Unicode版本。例如,下面是SetWindowText函数的两种C语言描述。可以看到,第一个描述将函数定义为SetWindowTextA,尾部的'A'表明它是一个ANSI函数:

  WINUSERAPIBOOLWINAPISetWindowTextA(HWNDhWnd,LPCSTRlpString);

  第二个描述将它定义为SetWindowTextW,尾部的'W'表明它是一个Unicode函数:

最后更新时间:2008-05-28 11:40:52
文章评论
共有 0 位网友发表了评论
用户名: 新注册) 密码: 匿名评论 [查看所有评论]

评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
您可以用以下几种方式找到此文章

考试全流程