3

プロジェクトを32ビットバージョンから64ビットバージョンに変換しています。プロジェクトを64ビットでコンパイルすると、次のエラーが発生します。

Error   2   error C2440: 'static_cast' : cannot convert from 'long (__cdecl BrnDefDlgClass::* )(UINT,long)' to 'LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)'  C:\Program Files (x86)\...\CXX\TEST.CXX 854 1   cfg

このエラーは、以下のコード行を示しています。

ON_MESSAGE        (WM_USER_AFTERCBNSELCHANGE,   OnAfterCBSelectMsg)

アドバイスこのエラーが発生する理由を教えてください。

ありがとう

4

2 に答える 2

7

OnAfterCBSelectMsgの定義を確認し、それを変更してLRESULT、リターンタイプとして、およびWPARAMパラメーターLPARAMとして(エラーメッセージの2番目のシグネチャとして)使用することをお勧めします。

LRESULTはとして定義されLONG_PTR、名前に表示される場合は常にPTR、ポインタを保持するのに十分な大きさであると期待する必要があります。ポインタは32ビットで4バイト、64ビットで8バイトであるため、64ビット用にコンパイルした場合は(4バイト)にLRESULT収まりません。long

プラットフォームによってサイズも変わるため、パラメータタイプとしてWPARAMおよびを使用することも重要です。LPARAM詳細については、この質問への回答を参照してください 。LPARAMおよびWPARAMの定義は何ですか。

于 2012-10-15T08:14:56.433 に答える
2

WPARAMとして定義されunsigned __int64、64ビットWindowsにLRESULTありLPARAMます。__int64

それに応じての署名を変更する必要がありますBrnDefDlgClass。組み込み型の代わりにWinAPIが提供するtypedefを使用した場合、32ビットプラットフォームと64ビットプラットフォームの両方でコンパイルできます。

于 2012-10-15T08:15:36.510 に答える