2012-01-02 22 views
2

マシン上で実行されているすべてのプロセス間で共有されるwin32/mfcを使用して、Windowsでデバイスに依存しないビットマップを作成する方法はありますか?プロセス間で共有されるビットマップ

Windows XP/7マシン上のすべてのプロセス間でDIBを共有する最善の方法をお探しの場合。プロセスは、ビットマップの内容をロックし、このビットマップ上で描画を行うことができ、他のプロセスもこのビットマップを読み取りに使用できるはずです。

最初にこのDIBはメインアプリケーションによって作成されます。他のプロセスがこのプロセスで何かを描画したい場合、このDIBの内容をロックしてこのビットマップに描画できます。他のプロセスがこのビットマップの内容を読み取る場合、ビットマップをロックしてビットマップを読み取ることができます。

時間の複雑さと空間の複雑さの両方で最良の方法を提案してください。空間の複雑さとは、このビットマップ上のコンテンツを描画したいプロセスは、ローカルメモリ上のすべてのコンテンツをコピーして描画する必要はなく、デバイスコンテキストでこのビットマップを直接取得してビットマップを描画できる必要があります。

答えて

3

残念ながら*、プロセス間でGDIハンドル(ビットマップなど)を共有する方法はサポートされていません。

複数のビットマップを取得して(複数のプロセスで)、同じストレージを共有する方法があります。

プライマリプロセスでは、CreateFileMapping APIを使用してメモリセクションを作成します。

あなたはあなたの様々なプロセスへのセクションのハンドルを取得する方法はいくつか持っている - (Hans Passantで指摘したように)そのうちの最も簡単な

は単に... CreateFileMapping関数を呼び出した後、OpenFileMappingを使用してセクションに名前を付けることです。 他のプロセスを起動するメインプロセスがある場合、SECURITY_ATTRIBUTESのbInheritHandleをTRUEに設定してセクションが作成され、ハンドルは自動的にサブプロセスに複製されます。通常、コマンドラインでハンドル値を渡します新しいプロセスの それ以外の場合はDuplicateHandle関数を使用してハンドルを他のプロセスにコピーしますが、処理のハンドルを取得するためには他の種類のIPCが必要です。

しかし、それは起こります - 各プロセスでCreateDIBSectionを呼び出して、同じメモリセクションによってバックアップされたGDIビットマップを作成することができます。ビットマップへのアクセスを同期する際のコメントに注意してください。複数のプロセスがビットマップに書き込もうとしている場合は、そのレベルでアクセスをシリアル化する必要があります。皮肉な注意点として

  • :Win32のは、Win16のに基づいているため、ウィンドウメッセージと実際にHBITMAPの複数のプロセスから使用できるように期待しますクリップボードを扱うのWin16従来のAPIが多いです。また、Windows NT 5.xおよび6.xのビットマップ上の(実装の詳細として)は、単一のシステムワイドハンドルテーブルからカーネルモードドライバによって割り当てられ、従って、任意のプロセスにおいて、技術的に有効である - しかし、GDIはまた、各々のプロセスIDを格納しますそのテーブル内のGDIオブジェクトとGDI API呼び出しは、プロセスIDを明示的にチェックし、別のプロセスに属するGDIハンドルで呼び出されると失敗します。
+1

OpenFileMappingで使用できるCreateFileMappingのlpName引数は、簡単に共有できるようにする必要があります。 –

+0

簡単なことを思い出させてくれてありがとう。私は時々かなりidjitすることができます。 –

+0

各プロセスのCreateDIBSectionの呼び出しごとに同じバッファを渡すにはどうすればよいですか。 – vicky

関連する問題