2012-12-06 118 views
0

您好我有一个源代码在32位编译使用vs2008时工作正常。现在我正试图在64位编译相同的源代码。对于这段代码:C2664:在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

什么是'EnumLangProc'?错误消息显然与'EnumLangProc'有关。如果错误消息引用EnumLangProc,则必须记住发布EnumLangProc的声明。 – AnT

+3

它看起来最后一个参数应该是'LONG_PTR'而不是'LONG'。无论哪种方式确保'EnumLangProc'的声明符合['ENUMRESLANGPROC'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms648033 \(v = vs.85 \).aspx) – user786653

回答

4

您的第四个回调参数定义为LONGEnumResLangProc预计LONG_PTR作为第四个参数。这是代码中的一个bug,但在32位LONGLONG_PTR(4字节)的大小相同,所以编译得很好。在64位LONG_PTR是8个字节长,所以你会得到一个错误。将您的回调签名更改为接受LONG_PTR作为第四个参数,并且它将针对32位和64位进行编译。

+0

@vivek,你应该接受这个答案。就像icepack说的,我的观察是正确的,但是这个答案解释了实际问题。 – chris

+0

谢谢icepack和chris – Vivek

4

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

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

CALLBACK本质上是#define d是__stdcall

+0

BOOL CALLBACK EnumLangProc( \t HMODULE \t \t HMODULE, \t LPCTSTR \t \t类型, \t LPCTSTR \t \t名, \t WORD \t \t语言, \t LONG \t \t用户数据) – Vivek

+0

这是我的定义EnumLangProc – Vivek

+0

LONG_PTR做了这个工作谢谢你们 – Vivek