2011-01-25 40 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的