如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如"_functionname" @ "number" ;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
如果我们不采用.def文件来声明函数名而是想直接调用__stdcall方式的函数,
而且使用C++编译方式的话,我们就需要去获得函数编译后的名字以便于我们在其他程序中进行调用。我们需要用到VS提供的dumpbin工具。
Microsoft COFF 二进制文件转储器 (DUMPBIN.EXE) 显示有关通用对象文件格式 (COFF) 二进制文件的信息。可以使用 DUMPBIN 检查 COFF 对象文件、标准 COFF 对象库、可执行文件和动态链接库 (DLL)等。
下面我用一个例子简单地说明一下:
1.首先我们在VS中创建C++ DLL项目,如dpSample
头文件dpSample.h我们如下编写













进行函数的定义后,我们生成DLL文件dpSample.dll
2.我们进入VS命令行(Visual Studio 命令提示)
进入dpSample.dll所在的路径
输入命令dumpbin /all dpSample.dll > dump.txt回车,将dpSample.dll中的可用信息dump到dump.txt文件中。
3.分析dump文件
打开dump.txt文件,我们会发现文件本身很乱,内容很多。这里我们不用一行一行地慢慢分析,直接Ctrl+F查找原函数名,本例中是dumpbinTest,得到的结果大概如下:
Section contains the following exports for dpSample.dll
00000000 characteristics
4B307976 time date stamp Tue Dec 22 15:47:02 2009
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00011005 ?dumpbinTest@@YGXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z = @ILT+0 (?dumpbinTest@@YGXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z">?dumpbinTest@@YGXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
00000000 characteristics
4B307976 time date stamp Tue Dec 22 15:47:02 2009
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00011005 ?dumpbinTest@@YGXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z = @ILT+0 (?dumpbinTest@@YGXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z">?dumpbinTest@@YGXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
而这其中最后的这个括号中的代码就是C++编译后我们的函数名称!!
好了,现在我们就可以直接在其他的程序中使用这个函数名调用这个函数了。
本文出自 “和谐的HeXen” 博客,请务必保留此出处http://hexen.blog.51cto.com/1110171/247547