オブジェクト ポインタを格納するための GWL_USERDATA の代替となるものは何ですか?
質問
私が取り組んでいる Windows アプリケーションには、Win32 のすぐ上に位置するカスタム フレームワークがあります (聞かないでください)。ウィンドウを作成するとき、通常は次のようにします。 this
ウィンドウのユーザーデータ領域で SetWindowLong(hwnd, GWL_USERDATA, this)
, これにより、MFC のようなコールバックや緊密に統合されたコールバックが可能になります。 WndProc
, 、場合によっては。問題は、LONG の幅が 32 ビットしかないため、これが Win64 では機能しないことです。32 ビット システムと 64 ビット システムの両方で機能する、この問題に対するより良い解決策は何でしょうか?
解決
SetWindowLongPtr を置き換えるために作成されました SetWindowLong このような場合には。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;
他のヒント
もう 1 つの選択肢は SetProp/RemoveProp です (すでに GWLP_USERDATA を使用しているウィンドウをサブクラス化している場合)
もう 1 つの優れた代替方法は、WNDPROC の ATL スタイルのサンクです。詳細については、「」を参照してください。
所属していません StackOverflow