HWND (C++ Visual Studio 8) に long をキャストするにはどうすればよいですか?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
しかし、次の警告が表示されました。
警告 C4312: '型キャスト': 'LONG' からより大きなサイズの 'HWND' への変換
ありがとう。
HWND (C++ Visual Studio 8) に long をキャストするにはどうすればよいですか?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
しかし、次の警告が表示されました。
警告 C4312: '型キャスト': 'LONG' からより大きなサイズの 'HWND' への変換
ありがとう。
あなたが持っている LONG が本当に HWND であると確信している限り、それは次のように簡単です:
HWND hWnd = (HWND)(LONG_PTR)lParam;
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 ビット アプリケーションを構築している場合は、それらを無視できます。
これは、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 ではエラーになることに注意してください。