windows - sets - winmain win32



Good or evil-異なるプロセス間のSetParent()win32 API (1)

異なるプロセスのウィンドウと親子関係を持つことができます。 すべてのケースで正しく機能するようにするのは難しいことです。 さまざまな奇妙な症状をデバッグする必要があるかもしれません。

通常、別々のプロセス内のウィンドウは、別々のメッセージポンプを使用して別々の入力キューからメッセージを取得します。 SendMessageを別のプロセスのウィンドウに使用すると、実際には他のウィンドウのキューにポストされ、そこで処理され、戻り値は効果的に元のプロセスにマーシャリングされます。 したがって、プロセスの1つがメッセージの処理を停止すると、他のプロセスも効果的にロックすることができます。 (ウィンドウが異なるスレッドで作成され、スレッドキューがアタッチされていないプロセス内であってもそうです。)

しかし、異なるスレッドのウィンドウ間で親子関係を設定すると、Windowsはそれらの入力キューをまとめて結合し、メッセージ処理を同期させます。 あなたはもはや通常の場合はありませんが、同じ種類の問題に直面しています.1つのウィンドウの処理がハングすると、他のプロセスが効果的にハングします。

params内のポインタを渡すメッセージに注意してください。 ポインタは受信プロセスでは有効ではありません。 ( WM_COPYDATAようないくつかの例外がありますが、受信プロセスのデータを再作成しますが、それらにも制限があります)。

窓が破壊されているときは特に注意する必要があります。 可能であれば、いずれかのウィンドウを破棄する前に親子関係を切断します。 可能でない場合は、親が破棄される前に 、子ウィンドウを手動で破棄することをお勧めします。 通常、親を破棄すると子は自動的に破棄されますが、子プロセスが別のプロセス(または接続されていないスレッド)にあるときにハングアップするのは簡単です。

新しいバージョンのWindows(Vista +)では、プロセスがさまざまな整合性レベルで実行されている場合、いくつかのセキュリティスピードバンプを実行することもできます。

IInspectableのおかげで、私の以前の答えに誤りがあることが指摘されました。

SetParent関数は、子ウィンドウハンドルと新しい親ウィンドウハンドルを取ります。 これは、子ウィンドウが別のWindowsプロセスにある場合にも機能するようです。

私はこれが正式にはサポートされていないと主張する投稿を見ましが、 現在のドキュメントではこれ以上言及していません。 これは現在のドキュメントの欠陥ですか、あるいはこの動作が変わりましたか?

HWND WINAPI SetParent(
  __in      HWND hWndChild,
  __in_opt  HWND hWndNewParent
);




winapi