2011-01-25 114 views
7

可能重複:
How do I stop name-mangling of my DLL's exported function?Unmangling C++ DLL函數名稱

我有一個用C寫的一個DLL ++。導出的函數名稱需要被取消。例如,int MyFunc(int Param1, int Param2);需要向嘗試調用庫函數的外部應用程序顯示爲MyFunc。但是,當我使用Dependency Walker查看它時,它看起來像[email protected]。這是如何我已經在C++中聲明:

extern "C" __declspec(dllexport) int WINAPI MyFunc(int Param1, int Param2); 

我以爲extern "C"會做的伎倆。我該如何擺脫這種損壞?謝謝。

+0

.def文件應該做的伎倆。 – ruslik 2011-01-25 15:14:24

+2

重複? http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function – MerickOWA 2011-01-25 15:15:46

+0

也有用的鏈接 - http://msdn.microsoft.com/en- US/library/x7kb4e2f(v = VS.80).aspx – MerickOWA 2011-01-25 15:17:48

回答

8

方式擺脫重整的:(假設MSVC是構建環境)

通過.def文件導出。

導出爲外部「C」,確保使用__cdecl調用約定。即使在使用extern「C」時,__stdcall也會預置_,並在dll導出函數上後綴@。

extern "C" __declspec(dllexport) int __cdecl MyFunc(int Param1, int Param2); 

使用#pragma指令導出。你需要通過這個完整的名字。 __FUNCDNAME__是把在宏的功能列出其修飾名有用的指令,

#pragma comment(linker, "/EXPORT:[email protected]"); 
2

這可能是因爲你沒有把extern "C" declspec放在函數定義上,你只把它放在聲明中。

+0

它在聲明和定義上。 – 2011-01-25 15:24:49

0

頁眉(.H),其定義爲:

extern "C" 
{ 
    __declspec(dllexport) int __stdcall MyFunc(int Param1, int Param2); 
} 

然後,該功能的實現(的.cpp):

extern "C" 
{ 
    __declspec(dllexport) int __stdcall MyFunc(int Param1, int Param2) 
    { 
    // ... code ... 
    } 
} 
3

領先的下劃線和@8後綴不是來自C++名稱的混淆,而是表示stdcall調用約定,正如dllexport一樣。

0

在GNU系統有C++ filt的