在xp 32bit中,该行编译没有问题,但是在vista 64bit中,此行:
m_FuncAddr = ::GetProcAddress (somthing);
给出以下错误
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)();