如果通過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我們如下編寫
#include <string>
#include "stdio.h"
using namespace std;
#ifndef DPSAMPLE_H
#define DPSAMPLE_H
__declspec(dllexport) void __stdcall dumpbinTest(string src);
#endif
進行函數的定義後,我們生成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)
而這其中最後的這個括號中的代碼就是C++編譯後我們的函數名稱!!
好了,現在我們就可以直接在其他的程序中使用這個函數名調用這個函數了。
本文出自 “和諧的HeXen” 博客,請務必保留此出處http://hexen.blog.51cto.com/1110171/247547