0

こんにちは私は32ビットでvs2008を使用してコンパイルされたときに正常に動作するソースコードを持っています。今、私は同じソースコードを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

コールバックの4番目のパラメーターはとして定義されLONGます。4番目のパラメーターとしてEnumResLangProc期待します。LONG_PTRこれはコードのバグですが、32ビットLONGでは(4バイト)と同じサイズであるLONG_PTRため、正常にコンパイルされます。64ビットLONG_PTRでは8バイト長なので、エラーが発生します。4番目のパラメーターとして受け入れるようにコールバック署名を変更するLONG_PTRと、32ビットと64ビットの両方でコンパイルされます。

于 2012-12-06T17:56:35.337 に答える