为了是用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 没被修改。