在 xp 32 位中,这一行编译没有问题,但是在 vista 64 位中,这一行:
m_FuncAddr = ::GetProcAddress (somthing);
出现以下错误
error C2440: '=' : cannot convert from 'FARPROC' to '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
另一边(边2)
INT_PTR far __stdcall GetProcAddress
如果两者都是 stdcalls,我怎么必须用 cdecl 转换 side 2 呢? 或者我没有得到什么?
最佳答案
返回类型应为 INT_PTR(64 位构建中的 64 位值)。你不应该绕过这个错误——编译器试图告诉你出了什么问题。
来自 WinDef.h:
#ifdef _WIN64
typedef INT_PTR (FAR WINAPI *FARPROC)();
所以m_FuncAddr的声明应该是:
INT_PTR (WINAPI *m_FuncAddr)();
关于c++ - stdcall 被 visual studio 覆盖了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210836/