畅享博客 > 航行日志——理论与实践并行 > 程序人生 > [原创]C++导出函数名问题
2007-7-12 14:01:32

[原创]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);

产生的名字就是

Run@0

 这个后面调用就很恐怖了,如果是一个现成的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);

}

 


推荐到鲜果:

评论

您正在以 匿名用户 的身份发表评论  快速登录
(不得超过 50 个汉字)
       看不清,换一个
提示消息
(输入完内容可以直接按Ctrl+Enter提交)