質問
私は、IPCの機能と別のプロセスから特定のリソースを渡す必要のいくつかの種類を書いています。これは、のDuplicateHandleを経由して複製することができるパイプハンドルなどに適しています。今、私は他の1つのプロセスからHDCを渡す必要があります。これさえ可能ですか?はいの場合:?どのように
サブ質問:私は、他の1つのプロセスからのウィンドウハンドル(HWND)を通過することは安全であると仮定しています。この仮定が正しいですか?
解決
すべてのGDIハンドルは、すべてのプロセスにマッピングされているテーブルに格納されています。テーブルのエントリは、所有しているプロセスのプロセスIDが含まれており、これはハンドルへのすべてのGDIのアクセスにチェックされます。
だから、(皮肉にも)、GDIハンドル - のHDCを含む - は広い有効なシステムです。しかし、唯一のそれらを作成したプロセスから使用することができます。
<時間>他のヒント
のHWNDは、プロセス間で共有することができる、のSendMessage()がそうでなければ動作しないであろう。彼らは、しかし、デスクトップがセッションに関連付けられている、特定のデスクトップにスコープされています。それぞれがログインしているユーザーのための1つのセッションがあります。そして、セッション0は特別、サービスが実行されるセッションです。そして、セキュリティで保護されたデスクトップ、あなたがログイン時に参照するか、あなたがCtrl + Alt + Delキーを押すと、パスワード入力ボックスと混乱することはできません1があります。しかし、両方のプロセスが同じデスクトップで実行する限り、あなたはすべての問題を持っていません。
のHDCは暗いであることが試したことがありません。私はそれをお勧めしません。あなたはいつもGetDC()とHWNDから1を作成することができます。
その後、尖ったnobugzによってアウトとクリス・ベッケとしては、プロセスの境界を越えてHDCことを共有することはできませんあなたが別のプロセスから(例えばBitBlt関数を使用して)1つのプロセスに属するHDC上にペイントすること、と仮定。しかし、さらにその1つのプロセスのHDCがウィンドウに属していると仮定して(とあなたの意図は、最終的にはそのウィンドウ上に描画することです)、あなたはHDCを取得するためにGetDc他のプロセスに、このプロセスを使用してそのウィンドウハンドルを渡すことができます。このHDCを使用すると、その後、他のプロセスのウィンドウにペイントすることができます。