VC编程时DLL中导出函数的声明有两种方式

2011-04-16 17:33:01|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++|来源:唯设编程网

在*.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文件方式导出函数了。

<12>
发表评论0条 】
网友评论(共?条评论)..
VC编程时DLL中导出函数的声明有两种方式