0

嗨,我有一个使用 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'

任何人都可以帮助我如何摆脱它?

4

2 回答 2

4

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

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

CALLBACK本质上是#defined __stdcall

于 2012-12-06T17:48:36.787 回答
4

回调的第四个参数定义为LONG. EnumResLangProc期望作为第四LONG_PTR个参数。这是代码中的一个错误,但在 32 位LONG中的大小与LONG_PTR(4 字节)相同,因此可以正常编译。在 64 位LONG_PTR中是 8 个字节长,所以你会得到一个错误。将您的回调签名更改为接受LONG_PTR作为第 4 个参数,它将为 32 位和 64 位编译。

于 2012-12-06T17:56:35.337 回答