MSDN によると、ウィンドウへのハンドル (HWND) は、プロセス間通信(MSDN)で 32 ビット アプリケーションと 64 ビット アプリケーションの間で共有できるとのことです。ただし、Win32 では HWND は 32 ビットですが、64 ビット Windows では 64 ビットです。では、ハンドルを共有するにはどうすればよいでしょうか。
同じ質問が、ミューテックス、セマフォ、ファイル ハンドルなどの名前付きオブジェクトのハンドルにも当てはまると思います。
MSDN によると、ウィンドウへのハンドル (HWND) は、プロセス間通信(MSDN)で 32 ビット アプリケーションと 64 ビット アプリケーションの間で共有できるとのことです。ただし、Win32 では HWND は 32 ビットですが、64 ビット Windows では 64 ビットです。では、ハンドルを共有するにはどうすればよいでしょうか。
同じ質問が、ミューテックス、セマフォ、ファイル ハンドルなどの名前付きオブジェクトのハンドルにも当てはまると思います。
上記で Daniel Rose が指摘しているように、MSDN のドキュメントには次のように記載されています。
... ハンドルを切り捨てる (64 ビットから 32 ビットに渡す場合) か、ハンドルを符号拡張する (32 ビットから 64 ビットに渡す場合) ことは安全です。
WOW64開発者からゼロ拡張が正しい方法であると言われたことを考えると、ここにはまだ混乱があるようです. 32 ビット モジュールからハンドルを取得する 64 ビット モジュールを作成している場合、最も安全な方法は、ハンドルの下位 32 ビットのみを比較する (つまり切り捨てる) ことです。そうしないと、符号拡張とゼロ拡張の違いに遭遇する可能性があります。
Microsoft WOW64 開発者から次のことを確認する電子メールを受け取りました。
ハンドルは 32 ビットであり、安全に切り捨て/ゼロ拡張できます。これは、カーネル オブジェクト ハンドルと USER/GDI ハンドルの両方に当てはまります。
共有できるということは、Win64 プロセスでは下位 32 ビットしか使われていないということではないでしょうか。Windowsハンドルは、少なくとも私が知る限り、ポインターではなくインデックスです。したがって、MSが2 ^ 32を超えるウィンドウ/ファイル/ミューテックス/などを許可したい場合を除きます。void*
Win64で a の上位 32 ビットを使用する理由はありません。
Microsoft インターフェイス定義言語 (MIDL) 移植ガイドの 12 ページ (http://msdn.microsoft.com/en-us/library/ms810720.aspx) を参照してください。
USER および GDI ハンドルは符号拡張された 32b 値です。
一般的に慎重になるのは正しいと思います。ただし、それらを共有できると主張する MSDN は、私たちプログラマーとの契約です。彼らは、「今日は共有する」と言い、明日は「共有しない」とは言えません。
同様に、x64 と 32 ビットのソフトウェアを特定のマシンで同時に実行し、すべての人がうまくやっていくには、HWND (および多くの HANDLE) が 32 ビットであり、互換性が保たれている必要があります。
私が言っているのは、少なくとも Windows 7 の存続期間中、そしておそらく Windows の「次の」期間中、これは非常に安全な賭けだと思うということです。