VisualBasic辅导:在VB中调用动态连接库
VisualBasic作为一个简单易用的Windows开发环境,自推出以来就受到了程序员的欢迎。它使得程序员不再需要直接面对复杂的Windows消息,而可以专注于程序功能的实现,大大提高了编程效率。但凡事有利有弊。VB中高度的封装和模块化减轻了程序员的负担,同时也让开发人员失去了很多访问底层API函数和直接与Windows交互的机会。所以相比较而言,VB应用程序的执行效率和功能都比C/C++或者Delphi生成的程序差。要解决这个问题,在大型VB开发应用中直接调用WindowsAPI函数几乎是不可避免的。同时,程序员可能需要用C/C++开发一些动态连接库,用于VB中的调用。本文主要讨论32位开发环境下的VisualBasic5。0中直接调用Windows95API函数或用户生成的32位动态连接库的方法和规则。
Windows动态连接库是一个包含数据和函数的模块,可以被其他可执行文件(EXE、DLL、OCX等)调用。).动态连接库包含两种函数:导出函数和内部函数。输出函数可以被其他模块调用,而内部函数只能在动态链接库内部使用。虽然动态链接库也可以输出数据,但实际上它的数据通常只在内部使用。使用动态连接库的优势是显而易见的。提取应用程序的部分功能制作动态链接库,不仅减小了主应用程序的大小,提高了程序的运行效率,而且更易于升级。多个应用程序共享一个动态连接库也可以有效地节省系统资源。正因为如此,动态链接库在Windows系统中得到了广泛的应用。
一般来说,动态链接库都是带DLL扩展名的文件,比如Kernel32。dll、commdlg .Dll等等。但也有例外,比如16位Windows的核心组件之一GDI。Exe其实就是一个动态库。编译动态链接库的工具有很多,比如VisualC++、BorlandC++、Delphi等。具体方法请参考相关文件。下面只用VisualC++5。0为例,介绍VisualBasic5在开发中的应用。0(本文中所有涉及C/C++语言或编译环境的地方都以VC5为例;所有对VisualBasic的引用都以VB5为例)。
作为32位Windows应用的开发工具,VB5生成的exe文件自然是32位的,通常只能调用32位的动态链接库。但是,并不是所有的32位动态库都能被VB生成的exe文件正确识别。一般来说,当你为VB应用程序调用编写自己的动态连接库时,要注意以下几个方面:
1.生成动态库时,应该使用__stdcall调用约定,而不是默认的__cdecl调用约定;__stdcall约定通常用于调用32位API函数。
2。VC5中的定义文件(Def),必须列出输出函数的函数名,以强制VC5系统将输出函数的decoratedname改为普通函数名;所谓修饰名,就是VC的编译器在编译过程中生成的输出函数名。它包含用户定义的函数名、函数参数和函数的类。因为在VC5中不需要定义文件,所以当项目不包含定义文件时,VC5会根据自己的约定,将用户自定义的输出函数名修改为装饰名,放入输出函数列表中。在VB生成的应用程序中无法正确调用这样的输出函数(除非声明时使用了Alias子句)。所以,需要补充一条。Def文件,该文件列出了用户需要强制VC5输出的不带修饰名的函数名。
3。VC5中的编译选项“structurememberalignment”应设置为4字节。后面会详细说明原因。
4。因为C中的整型变量是4个字节,而VB中的整型变量仍然只有2个字节,所以C中声明的integer (int)变量在VB中调用时要声明为long,而C中的short integer在VB中要声明为integer;下表列出了最常用的C语言数据类型的等效VisualBasic类型(适用于32位版本的Windows)。
C语言数据类型被声明为在VisualBasic中调用时使用的表达式
Atombyvalvaryable as int expression with Integer result
Boolbyvalvaryable as Long expression with Long result
ByvalvariableasByte导致Byte类型的表达式
CHARByValvariableAsByte导致Byte类型的表达式
ColorReFyvalvariableasLong导致Long类型的表达式
dwordbyvalvariableable的结果 HMENUByValvariableAsLong是Long类型的表达式,其他Windows句柄
INT,UINTByValvariableAsLong产生Long类型的表达式
longbyvalvariableslong产生Long类型的表达式
lparbyvalvariableslong产生Long类型的表达式
lpdwordvariableslong的结果是Long类型的表达式
LPINT,LPUINTvariableAsLong的结果是Long类型的表达式[. LPCSTRByValvariableAsString产生String类型的表达式
lpvoidvariableany任何变量(传递字符串时使用byval)
lpwordovariablesInteger产生integer类型的表达式
lresultbyvalvariablesLong产生long类型的表达式。
0条评论