64位移植: DLL 和 extern "C"

首先创建一个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 dlltest.dl
Dump of file dlltest.dll
File Type: DLL
  Section contains the following exports for DLLTest.dll
    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 dlltest.dll
Dump of file dlltest.dll
File Type: DLL
  Section contains the following exports for DLLTest.dll
    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
所以在某些C++项目中有def文件,这个文件用相当于dll的符号表,用来描述调用函数的名称,当其中包含特殊符号和后缀时,不足为奇。这也说明了C++的函数重载的实现方案,对相同名称的函数可采用不同的符号来表示。

VS2010中,64位生成符号表的方式不同,如果在函数前没有使用extern "C"时,它仍然生成如1表中那样的简单符号,所以需要根据dumpbin /exports 中显示的符号来修改def文件中的符号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值