7

HWND (C++ Visual Studio 8) に long をキャストするにはどうすればよいですか?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

しかし、次の警告が表示されました。

警告 C4312: '型キャスト': 'LONG' からより大きなサイズの 'HWND' への変換

ありがとう。

4

3 に答える 3

10

あなたが持っている LONG が本当に HWND であると確信している限り、それは次のように簡単です:

HWND hWnd = (HWND)(LONG_PTR)lParam;
于 2008-09-18T06:31:25.867 に答える
8

HWND は、ウィンドウへのハンドルです。この型は、WinDef.h で次のように宣言されています。

typedef HANDLE HWND;

HANDLE は、オブジェクトへのハンドルです。この型は、WinNT.h で次のように宣言されています。

typedef PVOID ハンドル;

最後に、PVOID は任意の型へのポインターです。この型は、WinNT.h で次のように宣言されています。

typedef void *PVOID;

したがって、HWND は実際には void へのポインターです。次のように long を HWND にキャストできます。

HWND h = (HWND)my_long_var;

ただし、my_long_var に格納される情報には十分注意してください。そこにポインターがあることを確認する必要があります。

後で編集: 警告は、64 ビットの移植性チェックがオンになっていることを示しています。32 ビット アプリケーションを構築している場合は、それらを無視できます。

于 2008-09-18T06:37:55.150 に答える
6

これは、64 ビット版の Windows を実行していない場合にのみ安全です。LONG 型は 32 ビットですが、HANDLE 型はおそらく 64 ビットです。コードを 64 ビット クリーンにする必要があります。つまり、LONG を LONG_PTR に変更する必要があります。

ポインタ型の使用規則:

ポインターを int、long、ULONG、または DWORD にキャストしないでください。一部のビットのテスト、ビットの設定またはクリア、またはその他の方法でその内容を操作するためにポインターをキャストする必要がある場合は、UINT_PTR または INT_PTR 型を使用します。これらの型は、32 ビット Windows と 64 ビット Windows の両方のポインターのサイズにスケーリングされる整数型です (たとえば、32 ビット Windows の場合は ULONG、64 ビット Windows の場合は _int64)。たとえば、次のコードを移植するとします。

ImageBase = (PVOID)((ULONG)ImageBase | 1);

移植プロセスの一環として、次のようにコードを変更します。

ImageBase = (PVOID)((ULONG_PTR)ImageBase | 1);

必要に応じて UINT_PTR と INT_PTR を使用してください (これらが必要かどうか不明な場合でも、念のため使用しても害はありません)。ポインターを ULONG、LONG、INT、UINT、または DWORD 型にキャストしないでください。

HANDLE は void* として定義されているため、HANDLE 値を ULONG 値に型キャストして下位 2 ビットをテスト、設定、またはクリアすると、64 ビット Windows ではエラーになることに注意してください。

于 2008-09-18T07:13:18.607 に答える