HWND へのロング (VS8 C++)
-
01-07-2019 - |
質問
HWND (C++ Visual Studio 8) にロングキャストするにはどうすればよいですか?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
しかし、次のような警告が表示されました。
警告 C4312:'タイプキャスト' :「LONG」からより大きなサイズの「HWND」への変換
ありがとう。
解決 2
HWND はウィンドウのハンドルです。この型は、WinDef.h で次のように宣言されます。
typedef ハンドル HWND;
HANDLE はオブジェクトのハンドルです。この型は、WinNT.h で次のように宣言されます。
typedef PVOID ハンドル;
最後に、PVOID は任意の型へのポインターです。この型は、WinNT.h で次のように宣言されます。
typedef void *PVOID;
したがって、HWND は実際には void へのポインタです。次のように HWND にロングをキャストできます。
HWND h = (HWND)my_long_var;
ただし、my_long_var にどのような情報が保存されているかには十分に注意してください。そこにポインターがあることを確認する必要があります。
後で編集:この警告は、64 ビット移植性チェックがオンになっていることを示唆しています。32 ビット アプリケーションを構築している場合は、これらを無視してかまいません。
他のヒント
所有している LONG が本当に HWND であることがわかっている限り、それは次のように簡単です。
HWND hWnd = (HWND)(LONG_PTR)lParam;
これを行うのは、64 ビット バージョンの Windows を実行していない場合にのみ安全です。LONG 型は 32 ビットですが、HANDLE 型はおそらく 64 ビットです。コードを 64 ビットクリーンにする必要があります。つまり、LONG を LONG_PTR に変更する必要があります。
int、long、ulong、またはdwordへのポインターをキャストしないでください。いくつかのビット、セットまたはクリアビットをテストするためにポインターをキャストする必要がある場合、またはそのコンテンツを操作する必要がある場合は、uint_ptrまたはint_ptrタイプを使用します。これらのタイプは、32ビットと64ビットの両方のウィンドウ(たとえば、32ビットウィンドウの場合はUlong、64ビットウィンドウの場合は_Int64)のポインターのサイズにスケーリングする積分タイプです。たとえば、次のコードを移植していると仮定します。
imagebase =(pvoid)((ulong)imagebase | 1);
移植プロセスの一部として、次のようにコードを変更します。
imagebase =(pvoid)((ulong_ptr)imagebase | 1);
必要に応じてuint_ptrとint_ptrを使用します(そして、それらが必要かどうかが不明な場合は、念のために使用することに害はありません)。ulong、long、int、uint、またはdwordにポインターをキャストしないでください。
ハンドルはvoid*として定義されているため、低次の2ビットをテスト、設定、またはクリアするために、ハンドル値を超値にタイプキャストすることは、64ビットウィンドウでのエラーです。