30

私が取り組んでいる Windows アプリケーションには、Win32 のすぐ上にあるカスタム フレームワークがあります (聞かないでください)。ウィンドウを作成するとき、通常は をthis介し​​てウィンドウのユーザー データ領域に配置しますSetWindowLong(hwnd, GWL_USERDATA, this)。これにより、MFC のようなコールバックまたは緊密に統合された を使用できますWndProc。問題は、LONG は 32 ビット幅しかないため、これが 64 ビット Windows では機能しないことです。32 ビット システムと 64 ビット システムの両方で機能する、この問題に対するより良い解決策は何ですか?

4

2 に答える 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 に答える