stdcall over-ride by visual studio?
在XP 32位这条线与不问题编译然而在Vista中的64位这一行:stdcall over-ride by visual studio?
m_FuncAddr = ::GetProcAddress (somthing);
提供了以下错误
错误C2440: '=':不能从 'FARPROC' 转换'INT(__cdecl *)(无效)'
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语句?
在此先感谢!
[编辑]
要clerfiy问题:
在等式的一侧(说侧1)我有
int __stdcall * m_FuncAddr
在另一侧(侧2)
INT_PTR far __stdcall GetProcAddress
那么,如果两个都是stdcalls,那么我怎么才能用cdecl来抛出第二面呢? 或者我没有得到什么?
返回类型应该是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的结果转换为正确的函数签名。在32bit中,FARPROC恰好符合您的签名,但可能不在64位。
编辑:是的,事实上,看着windef.h,返回类型是64位的INT_PTR,所以这就是为什么你得到编译器错误。不过,您仍然需要对上述函数签名进行强制转换,以避免出现与FARPROC的占位符不匹配的任何函数,因此您应该按照上述方法进行操作。
但是,FFuncType是stdcall,我将它转换为cdecl,或者我没有收到任何东西? – 2008-10-17 01:41:04
我的回答依然矗立你的编辑,诠释后INT_PTR在64位建立很大的不同! – 2008-10-17 01:53:19
如果您只查看“回复”标签,请参阅下面的编辑。 – 2008-10-21 01:04:11