C++ C2664:在64位编译时

C++ C2664:在64位编译时,c++,visual-studio-2008,visual-c++,64-bit,C++,Visual Studio 2008,Visual C++,64 Bit,您好,我有一个源代码,在使用vs2008编译时工作良好,为32位。现在我正在尝试用64位编译相同的源代码。对于这段代码: if(EnumResourceLanguages(gHResources, RT_STRING, MAKEINTRESOURCE(1),EnumLangProc, 0) && (0 < gNumSupportedLangs)) 有什么能帮我摆脱它的吗?您的回调使用的是cdecl呼叫约定。相反,它需要使用u stdcall调用约定。适当的功能原型为: B

您好,我有一个源代码,在使用vs2008编译时工作良好,为32位。现在我正在尝试用64位编译相同的源代码。对于这段代码:

if(EnumResourceLanguages(gHResources, RT_STRING, MAKEINTRESOURCE(1),EnumLangProc, 0) && (0 < gNumSupportedLangs))

有什么能帮我摆脱它的吗?

您的回调使用的是cdecl呼叫约定。相反,它需要使用u stdcall调用约定。适当的功能原型为:

BOOL CALLBACK EnumLangProc(HMODULE, LPCTSTR, LPCTSTR, WORD, LONG_PTR);

回调基本上被定义为u stdcall。

回调的第四个参数被定义为LONG。EnumResLangProc需要LONG_PTR作为第四个参数。这是代码中的一个错误,但32位的长度与LONG_PTR 4字节的大小相同,因此它可以很好地编译。在64位长度中,PTR为8字节,因此会出现错误。更改回调签名以接受LONG_PTR作为第四个参数,它将编译为32位和64位。

什么是EnumLangProc?错误消息显然与EnumLangProc有关。如果错误消息引用EnumLangProc,您必须记住发布EnumLangProc的声明。最后一个参数看起来应该是LONG_PTR而不是LONG。无论哪种方式,都要确保EnumLangProc的声明与BOOL回调EnumLangProc HMODULE HMODULE、LPCTSTR类型、LPCTSTR名称、WORD语言、LONG UserData匹配这就是我的定义EnumLangProc@chris虽然您的呼叫约定观察是正确的,但这并不是造成这种情况的原因error@icepack,我很确定这在过去给我带来了问题,但是是的,我忘记了错误只发生在64位,这与LONG_PTR的typedefd方式是合情合理的。@icepack,实际上,我的记忆可能是我在线程过程中使用了DWORD签名,而不是DWORD WINAPILPOID,然后在以后更改了这两个内容。“那很合适。”维韦克,你应该接受这个答案。正如icepack所说,我的观察是正确的,但这个答案解释了实际问题。
BOOL CALLBACK EnumLangProc(HMODULE, LPCTSTR, LPCTSTR, WORD, LONG_PTR);