首先创建一个C++工程,工程中的DLL库有两个可调用的函数。如下两个实例用来说明C++工程中不同的函数声明方式可产生不同的调用符号(symbol)。
1. 当函数声明包括extern "C"时, 符号表中的函数名称和声明的函数名称是一样的。因此在调用的时候,可以直接使用这两个函数名称来调用。
extern "C"__declspec(dllexport) int add(int&,int&);
extern "C" __declspec(dllexport) void rh0_dc_i16 (UINT *p);
D:\Projects\DLL\Debug>dumpbin /exports Dump of file File Type: DLL Section contains the following exports for 00000000 characteristics 50936510 time date stamp Fri Nov 02 14:15:44 2012 0.00 version 1 ordinal base 6 number of functions 6 number of names ordinal hint RVA name 1 0 00011019 ??0CDLLTest@@QAE@XZ = @ILT+20(??0CDLLTest@@QAE@XZ) 2 1 000110F5 ??4CDLLTest@@QAEAAV0@ABV0@@Z = @ILT+240(??4CDLLTest@@QAEAAV0@ABV0@@Z) 3 2 000110FF ?fnDLLTest@@YAHXZ = @ILT+250(?fnDLLTest@@YAHXZ) 4 3 00017130 ?nDLLTest@@3HA = ?nDLLTest@@3HA (int nDLLTest) 6 4 0001102D _rh0_dc_i16 = @ILT+40(_rh0_dc_i16) 5 5 000110C8 add = @ILT+195(_add) Summary |
2. 当函数声明不包括extern "C"时, 符号表中的函数名称和声明的函数名称是不一样的。如“add” 函数在符号表中为“?add@@YAHAAH0@Z”。因此在调用的时候,得用“?add@@YAHAAH0@Z” 来调用实际的add函数。
__declspec(dllexport) int add(int&,int&);
__declspec(dllexport) void rh0_dc_i16 (UINT *p);
D:\Projects\DLL\Debug>dumpbin /exports Dump of file File Type: DLL Section contains the following exports for 00000000 characteristics 50936594 time date stamp Fri Nov 02 14:17:56 2012 0.00 version 1 ordinal base 6 number of functions 6 number of names ordinal hint RVA name 1 0 00011019 ??0CDLLTest@@QAE@XZ = @ILT+20(??0CDLLTest@@QAE@XZ) 2 1 000110F0 ??4CDLLTest@@QAEAAV0@ABV0@@Z = @ILT+235(??4CDLLTest@@QAEAAV0@ABV0@@Z) 3 2 00011118 ?add@@YAHAAH0@Z = @ILT+275(?add@@YAHAAH0@Z) 4 3 000110FA ?fnDLLTest@@YAHXZ = @ILT+245(?fnDLLTest@@YAHXZ) 5 4 00017130 ?nDLLTest@@3HA = ?nDLLTest@@3HA (int nDLLTest) 6 5 0001106E ?rh0_dc_i16@@YGXPAI@Z = @ILT+105(?rh0_dc_i16@@YGXPAI@Z) Summary |
VS2010中,64位生成符号表的方式不同,如果在函数前没有使用extern "C"时,它仍然生成如1表中那样的简单符号,所以需要根据dumpbin /exports 中显示的符号来修改def文件中的符号。