2012-12-06 151 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