stdcall over-ride通过视觉工作室?

在xp 32bit这一行中vista 64bit这一行编译并不是问题:

m_FuncAddr = ::GetProcAddress (somthing); 

给出以下错误

错误C2440:'=':无法从'FARPROC'转换为'int(__cdecl *)(void)'

GetProcAddress被定义为

 WINBASEAPI FARPROC WINAPI GetProcAddress (somthing) 

和m_FuncAddr一样

 int (WINAPI *m_FuncAddr)(); 

从我的理解都是stdcall的。

为了避免我不得不提的错误

 m_FuncAddr = (int (__cdecl *)(void))::GetProcAddress(somthing); 

我的问题:

如果m_FuncAddr和GetProcAddress都具有stdcall调用约定,为什么我必须用cdecl“回想”它?

VS项目设置“默认调用约定(设置为cdecl)是否可能超出上面的assignemet语句?

提前致谢!

[编辑]

为了解决这个问题:

在方程的一边(比方说1)我有

 int __stdcall * m_FuncAddr 

另一方面(第二面)

 INT_PTR far __stdcall GetProcAddress 

那么,如果两个都是stdcalls,那么我怎么才能用cdecl来投2方? 还是我没有得到什么?

返回类型应该是INT_PTR(64位版本中的一个64位值)。 你不应该绕过这个错误 – 编译器试图告诉你有什么错误。

从WinDef.h:

 #ifdef _WIN64 typedef INT_PTR (FAR WINAPI *FARPROC)(); 

所以m_FuncAddr的声明应该是:

 INT_PTR (WINAPI *m_FuncAddr)(); 

这是一个巧合,它在32位编译正确; 正确的语法是:

 typedef int (WINAPI *FFuncType)(); FFuncType m_FuncAddr; m_FuncAddr = (FFuncType)::GetProcAddress (somthing); 

您需要明确地将:: GetProcAddress的结果转换为正确的函数签名。 在32位,FARPROC碰巧与你有签名,但可能不在64位。

编辑:是的,其实,看windef.h,返回类型是64位INT_PTR,所以这就是为什么你得到编译器错误。 你仍然需要像上面那样将函数转换为函数签名,而不是与FARPROC的占位符相匹配的函数,所以你应该这样做。