嗨,我使用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'
有没有人可以帮我解决这个问题?
答案 0 :(得分:4)
您的回调正在使用__cdecl
调用约定。相反,它需要使用__stdcall
调用约定。适当的函数原型将是:
BOOL CALLBACK EnumLangProc(HMODULE, LPCTSTR, LPCTSTR, WORD, LONG_PTR);
CALLBACK
基本上#define
为__stdcall
。
答案 1 :(得分:4)
回调的第四个参数定义为LONG
。 EnumResLangProc
期望LONG_PTR
为第4个参数。这是代码中的一个错误,但是32位LONG
与LONG_PTR
(4个字节)的大小相同,所以它编译得很好。在64位LONG_PTR
中长度为8个字节,因此您会收到错误消息。将您的回调签名更改为接受LONG_PTR
作为第4个参数,它将为32位和64位编译。