开发者

Unmangling C++ DLL Function Names [duplicate]

This question already has answers here: Closed 12 years ago.

Possible Duplicate:

How do I stop name-mangling of my DLL's exported function?

I have a DLL that is written in C++. The exported function names need to be unmangled. For example, int MyFunc( int Param1, int Param2 ); needs to appear to an outside application trying to call the library function simply as MyFunc. However, when I look at it using Dependency Walker, it looks like _MyFunc@8. This is how I have it declared in C++:

e开发者_StackOverflow社区xtern "C" __declspec(dllexport) int WINAPI MyFunc( int Param1, int Param2 );

I thought the extern "C" would do the trick. How do I get rid of the mangling? Thanks.


Ways to get rid of mangling: (assuming MSVC is the build environment)

Export via a .DEF file.

Export as extern "C" ensuring that the __cdecl calling convention is used. __stdcall prepends the _ and postpends the @ on dll exported functions even when extern "C" is used.

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

Export using a #pragma directive. You need to pass the fully mangled name on the other side of this. __FUNCDNAME__ is a useful directive to put in a macro in a function to list its decorated name,

#pragma comment(linker, "/EXPORT:MyFunc=_MyFunc@8");


The leading underscore and @8 suffix are not from C++ name mangling, but rather denote stdcall calling convention, as is normal for dllexport.


This is probably because you did not put extern "C" declspec on the function definition, you only put it on the declaration.


On the header (.h), define it as:

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

Then, on the implementation (.cpp) of the function:

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


On Gnu systems there is c++filt

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜