VBNET动态连接库还是比较常用的于是我研究了一下在这里拿出来和大家分享一下希望对大家有用Windows动态连接库是包含数据和函数的模块可以被其它可执行文件(EXEDLLOCX 等)调用动态连接库包含两种函数输出(exported)函数和内部(internal)函数输出函数可以被其它模块调用而内部函数则只能在动态连接库内部使用
尽管VBNET动态连接库也能输出 数据但实际上它的数据通常是只在内部使用的使用动态连接库的优点是显而易见的将应用程序的一部分功能提取出来做成动态连接库不但减小了主应用程序的大小提高了程序 运行效率还使它更加易于升级多个应用程序共享一个动态连接库还能有效地节省系统资源正因为如此在Windows系统中动态连接库得到了大量的使用
一般来说动态连接库都是以DLL为扩展名的文件如Kerneldllcommdlgdll等但也有例外如位Windows的核心部件之一GDIexe其实也是一个动态库编写动态连接库的工具很多如VisualC++BorlandC++Delphi等具体方法可以参见相关文档下面只以Visual C++为例介绍一下开发应用于VisualBasic的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方都以VC为例所有涉及Visual Basic的地方都以VB 为例)
作为一种位Windows应用程序的开发工具VB生成的exe文件自然也都是位的通常情况下也只能调用位的动态连接库但是并不是所有的位动态库都能被VB生成的exe 文件正确地识别一般来说自己编写用于VBNET动态连接库时应注意以下几个方面的
问题
生成动态库时要使用__stdcall调用约定而不能使用缺省的__cdecl调用约定__stdcall 约定通常用于位API函数的调用
在VC中的定义文件(def)中必须列出输出函数的函数名以强制VC系统将输出函数的装饰名(decoratedname)改成普通函数名所谓装饰名是VC的编译器在编译过程中生成的输出函数名它包含了用户定义的函数名函数参数及函数所在的类等多方面的信息由于在VC中定义文件不是必需的因此工程不包含定义文件时VC就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)因此需要增加一个def文件其中列出用户需要的函数名以强制VC不按装饰名进行输出
VC中的编译选项结构成员对齐方式(structure member alignment) 应设成字节其原因将在后文详细介绍
由于在C中整型变量是个字节而VB中的整型变量依然只有个字节因此在C中声 明的整型(int)变量在VB中调用时要声明为长整型(long)而C中的短整型(short)在VB中则 要声明成整型(integer)下表针对最常用的C语言数据类型列出了与之等价的Visual Basic 类型(用于位版本的Windows)