2011-04-16 17:33:01|?次阅读|上传:wustguangh【已有?条评论】发表评论
在*.cpp中
int __stdcall Add(int numa, int numb) { return (numa + numb); } int __stdcall Sub(int numa, int numb) { return (numa - numb); }
然后创建一个.def的文件,在里面加上:
;DllTestDef.lib : 导出DLL函数 ;作者:---- LIBRARY DllTestDef EXPORTS Add @ 1 Sub @ 2
最后创建一个测试程序:.cpp文件如下:
#include #include using namespace std; typedef int (__stdcall *FUN)(int, int); HINSTANCE hInstance; FUN fun; int main() { hInstance = LoadLibrary("DLLTestDef.dll"); if(!hInstance) cout << "Not Find this Dll" << endl; fun = (FUN)GetProcAddress(hInstance, MAKEINTRESOURCE(1)); if (!fun) { cout << "not find this fun" << endl; } cout << fun(1, 2) << endl; FreeLibrary(hInstance); return 0; }
.def文件的规则为:
(1)LIBRARY语句说明.def文件相应的DLL;
(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
(4)使用__declspec(dllexport)和使用.def文件是有区别的。
如果你的DLL是提供给VC用户使用的,你只需要把编译DLL时产生的.lib提供给用户,
它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。
因为VC++编译器对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall Add()
会转换为Add@0,这样你在VB中必须这样声明:
Declare Function Add Lib "DLLTestDef.dll" Alias "Add@0" () As Long
@后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式导出函数了。