オブジェクト ポインタを格納するための GWL_USERDATA の代替となるものは何ですか?

StackOverflow https://stackoverflow.com/questions/23083

  •  09-06-2019
  •  | 
  •  

質問

私が取り組んでいる 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 スタイルのサンクです。詳細については、「」を参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top