在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)();

09-05 23:21