WinAPI では、HANDLE
型は として定義されているvoid*
ため、64 ビット アプリケーションでは、HANDLE
値は から0
までの範囲になり18446744073709551615
ます。しかし、それは実際には本当ですか?そのようなの積分範囲を指定するドキュメントはありますHANDLE
か?
たとえば、これHANDLE
をint32_t
32 ビット アプリケーションに保存したい場合はまったく問題ありませんが、64 ビット アプリケーションでは疑問が残ります。
MSDN の状態:
32 ビット アプリケーションと 64 ビット アプリケーション間のプロセス間通信
Windows の 64 ビット バージョンは、相互運用性のために 32 ビット ハンドルを使用します。32 ビット アプリケーションと 64 ビット アプリケーションの間でハンドルを共有する場合は、下位 32 ビットのみが重要であるため、(64 ビットから 32 ビットにハンドルを渡す場合) ハンドルを切り捨てるか、ハンドルを符号拡張 ( 32 ビットから 64 ビットに渡す場合)。共有できるハンドルには、ウィンドウ (HWND) などのユーザー オブジェクトへのハンドル、ペンやブラシ (HBRUSH および HPEN) などの GDI オブジェクトへのハンドル、およびミューテックス、セマフォ、ファイル ハンドルなどの名前付きオブジェクトへのハンドルが含まれます。
また、そのページに追加された次のコメントも注目に値します。
プロセスの境界を越えてこのようなハンドルを共有する適切な方法は、32 ビット ハンドルを 64 ビットにゼロ拡張すること、またはその逆に 64 ビット ハンドルを 32 ビットに切り詰めて上位ビットを破棄することです。
ハンドルの「符号拡張」とハンドルの「ゼロ拡張」の違いに注意してください。
編集:この質問に対する削除された回答で見られる議論から判断すると、ゼロ拡張ではなく 64 ビット ハンドルに到達するために 32 ビット ハンドルを符号拡張することの重要性は、INVALID_HANDLE_VALUE の適切な処理を保持することであると思います。ハンドルの値。
文書化されている場所を知りたいのですが、私の同僚は、64 ビットの HWND ハンドルは常に 32 ビットに収まると主張しています。それが真実ではなく、未来やそれが文書化されている場所について話すことができないというケースを見たことがありません。たとえば、HTREEITEM などの他のハンドルについては....それらは完全な 64 ビットであり、32 ビットにも収まるという仮定に少し悩まされています。