[原创]C++导出函数名问题
用C++写的动态连接库dll时,提供函数的入口点。
有时会写成
extern "C" __declspec(dllexport) bool __fastcall Run(void)
其中extern "C"是用来告诉编译器使用C的命名方式,不要使用C++ 的mangled name。
这样后边直接导入Run即可。
但通常这样写
__declspec(dllexport) bool __fastcall Run(void)
这种写法编译器会以特有的方式对函数重新命名,比如BCB的规则如下:
void Run(void) @Run$qv
void _stdcall Run(void) @Run$qqsv
void _cdecl Run(void) @Run$qv
void _pascal Run(void) @Run$QV
void _fastcall Run(void) @Run$qqrv
不同的前缀,后边的附加的内容也不同。
如果是VC
extern "C" _declspec(dllexport) void __stdcall Run(void);
产生的名字就是
这个后面调用就很恐怖了,如果是一个现成的dll,怎么知道该用哪个名字呢?
还好VC有个工具,dumpbin
使用如下 dumpbin /exports Run.dll
就可以看到函数真实的名字了。
比如BCB的dll,可能会看到 @Run$pprp9tagTrd
那么使用就应该这样
void OnCall()
{
void (*Run)(void);
HINSTANCE hInst;
hInst = LoadLibrary("test.dll");
(FARPROC &)Run=GetProcAddress(hInst,"@Run$pprp9tagTrd");
Run();
FreeLibrary(hInst);
}
推荐到鲜果:



评论