私が取り組んでいる Windows アプリケーションには、Win32 のすぐ上にあるカスタム フレームワークがあります (聞かないでください)。ウィンドウを作成するとき、通常は をthis
介してウィンドウのユーザー データ領域に配置しますSetWindowLong(hwnd, GWL_USERDATA, this)
。これにより、MFC のようなコールバックまたは緊密に統合された を使用できますWndProc
。問題は、LONG は 32 ビット幅しかないため、これが 64 ビット Windows では機能しないことです。32 ビット システムと 64 ビット システムの両方で機能する、この問題に対するより良い解決策は何ですか?
Benjamin Pollack
質問する
19409 次
2 に答える
41
これらのインスタンスでSetWindowLongを置き換えるために、SetWindowLongPtrが作成されました。LONG_PTR パラメーターを使用すると、32 ビットまたは 64 ビットのコンパイル用のポインターを格納できます。
LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);
定数も変更されていることに注意してください。使用方法は次のようになります。
SetWindowLongPtr(hWnd, GWLP_USERDATA, this);
また、ポインターを取得するにはGetWindowLongPtrを使用する必要があることも忘れないでください。
LONG_PTR GetWindowLongPtr(
HWND hWnd,
int nIndex
);
使用法は次のようになります (ここでも、定数が変更されています)。
LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;
于 2008-08-22T18:21:41.783 に答える
12
もう1つの方法は、SetProp / RemovePropです(すでにGWLP_USERDATAを使用しているウィンドウをサブクラス化する場合)
もう1つの優れた代替手段は、WNDPROCのATLスタイルのサンクです。詳細については、を参照してください。
于 2008-08-28T20:38:17.347 に答える