2022年在vb中调用dll的方法终版 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年在vb中调用dll的方法终版 .pdf》由会员分享,可在线阅读,更多相关《2022年在vb中调用dll的方法终版 .pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 制作好 DLL 之后,就可以用VB 调用它,实现VB 调用 C 程序。 VB 程序要使用DLL 中的函数,首先必须要有特殊的声明,用Declare 声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB 中,供 VB 程序调用。语句格式为: Declare Sub 过程名 Lib Alias 别名 (ByVal 参数 AS 类型 ) ,或为 Declare Function 函数名 Lib Alias 别名 (ByVal 参数 AS 类型 )AS 类型在声明中首先用Declare关键字表示声明DLL 中的函数。 在 C 语言中有的函数类型为VOID ,它表示
2、不具有返回值,则必须用关键字Sub 将其声明成过程。有的函数具有返回值,则必须用关键字Function 将其声明成函数,并且在声明语句的最后要用AS 关键字指明函数返回值的类型。例如上面的ADD.DLL在 VB 中就可以声明为:Declare Function ADD Lib “ c:ADD.dll” (ByVal X AS Integer, ByVal Y AS Integer ,ByVal filein asstring)AS Integer 通过此声明语句将函数ADD 声明到 VB 中,便可直接调用。2、dll 文件中的函数好像是C 语言写的 , / 函数名 :int _stdcall
3、GetMacNo(int *MacNo) / 功能:获取卡机的卡机号(单机时 ) / 参数 : MacNo0- 被读出的卡机号/ 返回值: 0-成功 , / 2-PC 接收超时,/ 3-应答错误dll 的文件名是COMM232.dll 函数的形参int *MacNo是指针吗 ? 在 VB 中应该怎么声明和调用该函数? VB 里也可以定义指针吗? 问题补充: vb 调用 dll 文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事, 我是这样声明的对吗? Public Declare Function GetMacNo Lib COMM232.dll (ByVal MacNo As I
4、nteger) As Integer 又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo 还是要怎么做? 都说了 MacNo 是被读出的卡机号,那么就是传址的了。dim l as integer dim m as integer l=GetMacNo(m) if l=0 then label1.caption= 卡机号 : & m elseif l=2 then msgbox PC 接收超时 elseif l=3 then msgbox 应答错误 end if 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
5、 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL 、OCX 等)调用。 动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有
6、效地节省系统资源。正因为如此,在Windows 系统中,动态连接库得到了大量的使用。一般来说,动态连接库都是以DLL 为扩展名的文件,如Kernel32.dll 、commdlg.dll 等。但也有例外,如16 位 Windows 的核心部件之一GDI.exe 其实也是一个动态库。编写动态连接库的工具很多,如VisualC+ 、BorlandC+ 、Delphi 等,具体方法可以参见相关文档。下面只以 Visual C+6.0 为例,介绍一下开发应用于VisualBasic6.0 的动态连接库时应注意的问题(本文中所有涉及C/C+语言或编译环境的地方,都以VC 为例;所有涉及Visual Ba
7、sic的地方都以VB 为例)。作为一种 32 位 Windows 应用程序的开发工具, VB 生成的 exe 文件自然也都是32 位的,通常情况下也只能调用32 位的动态连接库。 但是, 并不是所有的32 位动态库都能被VB 生成的 exe 文件正确地识别。一般来说, 自己编写用于VB 应用程序调用的动态连接库时,应注意以下几个方面的问题:1、生成动态库时要使用_stdcall 调用约定,而不能使用缺省的_cdecl 调用约定;_stdcall 约定通常用于32 位 API 函数的调用。2、在 VC 中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC 系统将输出函数的装饰名 (d
8、ecoratedname)改成普通函数名;所谓装饰名是VC 的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。由于在VC 中定义文件不是必需的,因此工程不包含定义文件时VC 就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB 生成的应用程序中是不能正确调用的(除非声明时使用Alias 子句) 。因此需要增加一个.def 文件,其中列出用户需要的函数名,以强制VC 不按装饰名进行输出。3、VC 中的编译选项结构成员对齐方式(structure member alignment ) 应设成 4 字节,其原因
9、将在后文详细介绍。4、由于在C 中整型变量是4 个字节,而VB 中的整型变量依然只有2 个字节,因此在C 中声明的整型 (int) 变量在 VB 中调用时要声明为长整型(long) ,而 C 中的短整型(short)在 VB 中则 要声明成整型 (integer) ;下表针对最常用的C 语言数据类型列出了与之等价的Visual Basic 类型(用于32 位版本的Windows ) 。C 语言数据类型在VisualBasic 中声明为调用时使用的表达式ATOM ByVal variable As Integer 结果为 Integer 类型的表达式名师资料总结 - - -精品资料欢迎下载 -
10、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 19 页 - - - - - - - - - BOOL ByVal variable As Long 结果为Long 类型的表达式BYTE ByVal variable As Byte 结果为Byte 类型的表达式CHAR ByVal variable As Byte 结果为Byte 类型的表达式COLORREF ByVal variable As Long 结果为Long 类型的表达式DWORD ByVal variable As Long 结果为Long 类型的表达
11、式HWND, HDC, HMENU ByVal variable As Long 结果为Long 类型的表达式等Windows 句柄INT, UINT ByVal variable As Long 结果为Long 类型的表达式LONG ByVal variable As Long 结果为Long 类型的表达式LPARAM ByVal variable As Long 结果为Long 类型的表达式LPDWORD variable As Long 结果为Long 类型的表达式LPINT, LPUINT variable As Long 结果为Long 类型的表达式LPRECT variable A
12、s type 自定义类型的任意变量LPSTR, LPCSTR ByVal variable As String 结果为String 类型的表达式LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)LPWORD variable As Integer 结果为 Integer 类型的表达式LRESULT ByVal variable As Long 结果为Long 类型的表达式NULL As Any 或 ByVal Nothing 或ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal varia
13、ble As Integer 结果为 Integer 类型的表达式VOID Sub procedure 不可用WORD ByVal variable As Integer 结果为 Integer 类型的表达式WPARAM ByVal variable As Long 结果为Long 类型的表达式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - 5、VB 中进行 32 位动态库的声明时,函数名是大小写敏感的。在获得了需要的动态连接
14、 库之后,就可以在VB 中进行调用了。但是,由于VB 不能验证应用程序传递到动态连接库中的参数值是否正确,因此VB 程序中大量的API 调用可能会降低整个应用程序的稳定性,也会增加以后维护的难度。所以,决定在VB 程序中直接调用API 函数时要慎重,但适当的使用API 调用确实能够有效地提高VB 程序的性能。这之间的平衡需要编程人员根据实际情况来掌握。下面就具体介绍一下在VB 中调用 API 函数时需要做的工作。要声明一个DLL 过程,首先需要在代码窗口的通用( General)部分增加一个Declare语句。如果该过程返回一个值,应将其声明为Function:Declare Function
15、 publicname Lib libname Alias alias (ByVal variable As type ,ByVal variable As type.) As Type 如果过程没有返回值,可将其声明为Sub:Declare Sub publicname Lib libname Alias alias (ByVal variable As type ,ByVal variable As type.) 缺省情况下,在标准模块中声明的DLL 过程,可以在应用程序的任何地方调用它。在其它类型的模块中定义的DLL 过程则是模块私有的,必须在它们前面声明Private 关键字,以示区分
16、。下面分别介绍声明语句的各个组成部分。(一)、 指定动态库 :Declare 语句中的Lib 子句用来告诉Visual Basic 如何找到包含过程的.dll 文件 。 如果引用的过程属于Windows 核心库( User32、Kernel32 或 GDI32 ) ,则可以不包含文件扩展名,如:Declare Function GetTickCount Lib kernel32 Alias GetTickCount () As Long 对于其它动态连接库,可以在Lib 子句指定文件的路径:Declare Function lzCopy Lib c:windowslzexpand.dll _
17、(ByVal S As Integer, ByVal D As Integer) As Long 如果未指定libname 的路径, Visual Basic 将按照下列顺序查找该文件:.exe 文件所在的目录当前目录Windows 系统目录名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 19 页 - - - - - - - - - Windows 目录Path 环境变量中的目录下表中列出了常用的操作系统环境库文件。动态链接库描述Advapi32.dll 高级 API 服
18、务,支持大量的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
19、提供的工具API Viewer 查找某一函数及其相关数据结构和常数的声明,并复制到自己的程序中。(二)、使用别名:A.函数名是标准的名称Declare 语句中的Alias 子句是一个可选的部分,用户可以通过它所标识的别名对动态库中的函数进行引用。例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll.dll中最初的名字是名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 19 页 - - - - - - - - - MyFunction
20、X 。Private Declare Function MyFunction Lib Mydll.dll _ Alias MyFunctionX ( ) As Long 需要注意的是,Alias 子句中的函数名是大小写敏感的,也就是说,必须与函数在生成时的声明(如在C 源文件中的声明)一致。这是因为32 位动态库与16 位动态库不同,其中的函数名是区分大小写的。同样道理, 如果没有使用Alias 子句,那么在 Function(或 Sub)后的函数名也是区分大小写的。通常在以下几种情况时需要使用Alias 子句:A.处理使用字符串的系统Windows API 过程如果调用的系统Windows
21、API 过程要使用字符串,那么声明语句中必须增加一个Alias 子句,以指定正确的字符集。包含字符串的系统Windows API 函数实际有两种格式:ANSI和 Unicode ( 关于 ANSI 和 Unicode 两种字符集的区别将在后面详细阐述)。 因此, 在 Windows头文件中,每个包含字符串的函数都同时有ANSI版本和Unicode 版本。例如,下面是SetWindowText函 数的 两 种C语 言 描 述 。 可 以 看 到 , 第 一 个 描 述 将 函 数 定 义 为SetWindowTextA ,尾部的 A 表明它是一个ANSI 函数:WINUSERAPI BOOL W
22、INAPI SetWindowTextA(HWND hWnd, LPCSTR lpString); 第二个描述将它定义为SetWindowTextW , 尾部的 W 表明它是一个Unicode 函数:WINUSERAPI BOOL WINAPI SetWindowTextW(HWND hWnd, LPCWSTR lpString); 因为两个函数实际的名称都不是SetWindowText ,要引用正确的函数就必须增加一个Alias 子句:Private Declare Function SetWindowText Lib user32 _ Alias SetWindowTextA (ByVal
23、 hwnd As Long, ByVal _ lpString As String) As Long 应当注意,对于VB 中使用的系统WindowsAPI 函数,应该指定函数的ANSI 版本,因为只有 WindowsNT 才支持 Unicode 版本,而Windows95 不支持这个版本。仅当应用程序只运行在 WindowsNT 平台上的时候才可以使用Unicode 版本。B.函数名是不标准的名称有时,个别的 DLL 过程的名称不是有效的标识符。例如,它可能包含了非法的字符(如名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师
24、精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - 连 字符),或者名称是VB 的关键字(如GetObject) 。在这种情况下,可以使用Alias 关键字。例如,操作环境DLLs 中的某些过程名以下划线开始。尽管在VB 标识符中允许使用标识符, 但是下划线不能作为标识符的第一个字符。为了使用这种过程,必须先声明一个名称合法的过程,然后用 Alias 子句引用过程的真实名称:Declare Function lopen Lib kernel32 Alias _lopen _ (ByVal lpPathName As String, ByVal i
25、ReadWrite _ As Long) As Long 在上例中, lopen 是 VB 中使用的过程名称。而_lopen 则是动态连接库中可以识别的名称。C.使用序号标识DLL 过程除了使用名称之外,还可以使用序号来标识DLL 过程。某些动态连接库中不包含过程的名称,在声明它们包含的过程时必须使用序号。同使用名称标识的DLL 过程相比,如果使用序号, 在最终的应用程序中消耗的内存将比较少,而且速度会快些。但是,一个具体的API 的序号在不同的操作系统中可能是不同的。例如GetWindowsDirectory在 Win95 下的序号为 432,而在 WindowsNT4.0 下为 338。总
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年在vb中调用dll的方法终版 2022 vb 调用 dll 方法
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内