现在的位置: 首页 > 综合 > 正文

dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!

2013年06月07日 ⁄ 综合 ⁄ 共 665字 ⁄ 字号 评论关闭

为了是用vc写的dll能被其它语言的写的程序使用,即实现跨语言。我们在dll的函数调用约定中使用__stdcall .

但当用GetProcAddress调用是却失败了.

例如:

extern "C" ITimeSource* __stdcall CreateTimeSource(ETimeSourceType type)

typedef ITimeSource *( __stdcall *lpCreateTimeSource)(ETimeSourceType type);

 lpCreateTimeSource CreateTimeSource=(lpCreateTimeSource)GetProcAddress(hDll,"CreateTimeSource")

改成

 lpCreateTimeSource CreateTimeSource=(lpCreateTimeSource)GetProcAddress(hDll,_CreateTimeSource@4)

就正确了。

如果你用dumpbin工具查看导出的函数名可以看到:导出的函数名确实为_CreateTimeSource@4

所以我们要阻止导出的函数名被编译器修改,方法就是使用def文件

LIBRARY clock

EXPORTS

CreateTimeSource @ 1
DeleteTimeSource @ 2
CreateClock @ 3
DeleteClock @ 4
CreateTimer @ 5
DeleteTimer @ 6

再使用dumpbin工具查看导出的函数名发现函数名为:CreateTimeSource 没被修改。

抱歉!评论已关闭.