C2664:在64位编译时

时间:2012-12-06 17:42:14

标签: c++ visual-studio-2008 visual-c++ 64-bit

嗨,我使用vs2008编译时,源代码工作正常,32位。现在我试图在64位编译相同的源代码。对于这段代码:

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

我收到以下错误:

Error: error C2664: 'EnumResourceLanguagesA' : cannot convert parameter 4 from 'BOOL (__cdecl *)(HMODULE,LPCTSTR,LPCTSTR,WORD,LONG)' to 'ENUMRESLANGPROCA'

有没有人可以帮我解决这个问题?

2 个答案:

答案 0 :(得分:4)

您的回调正在使用__cdecl调用约定。相反,它需要使用__stdcall调用约定。适当的函数原型将是:

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

CALLBACK基本上#define__stdcall

答案 1 :(得分:4)

回调的第四个参数定义为LONGEnumResLangProc期望LONG_PTR为第4个参数。这是代码中的一个错误,但是32位LONGLONG_PTR(4个字节)的大小相同,所以它编译得很好。在64位LONG_PTR中长度为8个字节,因此您会收到错误消息。将您的回调签名更改为接受LONG_PTR作为第4个参数,它将为32位和64位编译。