VB等语言调用C++DLL
DLL(dynamic-link library)是一个包含一个或多个被编译、链接的函数/模块的文件, 并和调用它的进程分开存
储。当使用者进程启动或运行时,操作系统负责把DLL映射到调用者进程的内存地址空间里。采用DLL技术,可以提高软件模
块的重用性(DLL调用者可以不太关心该DLL是用何种语言写的)并起到保护源代码的目的,同时又能减少最终生成的可执行
文件的大小。
DLL包含一个导出函数表,它包含了函数在DLL内的地址,但当客户程序装入DLL时并不知道要调用的函数地址,它是通
过函数的符号化名字和序号来识别这些函数的。简单的程序通常是一个EXE从一个或多个DLL导入函数。
C/C++兼具低、高级语言的特点于一身,同时又有别的语言无法取代的特点,因此,C/C++语言写的DLL在处理某些
问题时显的尤为重要。同时由于编译器的不同和其他原因,编译器并未为跨语言调用DLL做太多工作。
在讨论VB(Pascal、Fortran)中调用C/C++DLL前,有必要先谈一下函数调用约定(Function Calling
Convention)和名字修饰(Name Decoration)。
1 函数调用约定(Function Calling Convention)
函数调用约定确定一个程序如何实现一个函数调用及参数如何传递。在单一语言
程序中,调用约定几乎总是正确的,这是因为对所有模块总有一个缺省的约定并且头文件会负责调用和被调用程序之间的一
致性。在一个混合语言程序中,不同的语言不可能分享同一个头文件。由于调用约定而产生的错误在编译时无法发现,直到
程序在运行时(run-time)实现函数调用时才出现并会立即导致应用程序崩溃。
VC++所支持的调用约定如下表:
关键字 |
栈的维护者 |
参数传递 |
__cdecl |
调用者 |
参数反序入栈(右->左) |
__stdcall |
被调用者 |
参数反序入栈(右->左) |
__fastcall |