在Windows XP 32位上,这行代码可以编译通过,但在Windows Vista 64位上,这行代码会出现问题:
在另一侧(第二侧)
那么如果两者都是stdcall,我为什么要使用cdecl来转换第二个参数?或者我理解错了什么?
m_FuncAddr = ::GetProcAddress (somthing);
出现以下错误:
error 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)会覆盖上面的赋值语句?
提前感谢!
[编辑]
为了澄清问题:
在等式的一侧(称为第1侧),我有
int __stdcall * m_FuncAddr
在另一侧(第二侧)
INT_PTR far __stdcall GetProcAddress
那么如果两者都是stdcall,我为什么要使用cdecl来转换第二个参数?或者我理解错了什么?