WM_COPYDATA を使用して、2 つのプロセス A と B 間の通信を有効にします。基本的なデータ型でデータを交換するのに問題はありません。
場合によっては、プロセス A からプロセス B にインターフェイス (IDispatch) を渡したいことがあります。それは可能ですか?
インターフェイス ポインタを別のプロセスに直接渡すことはできません。他のポインターと同様に、インターフェイスは、実行時にインスタンス化するプロセス アドレス空間でのみ有効です。COM には、プロセスの境界を越えてインターフェイスとデータをマーシャリングするための独自のメカニズムがあり、同じプロセス内の異なるアパートメント間であっても同様です。インターフェイスの場合、これには、各プロセス/アパートメントで実行され、パイプ、RPC、または TCP/IP などのさまざまな IPC メカニズムを使用して相互に通信するプロキシとスタブが含まれます。プロセス/アパートメント間でインターフェイスを使用する方法については、次の記事をご覧ください。
カスタム マーシャリングの実装に頼ることなく、求めていることを実行するには、プロセスの 1 つをアウトプロセス COM サーバーとして機能させ、他のプロセスがインターフェイス ポインターを使用CoCreateInstance()
または取得できるようにする必要があります。GetActiveObject()
サーバーのオブジェクトをローカル アドレス空間内で動作させ、COM にマーシャリングの詳細を処理させます。
直接行うことはできませんが、インターフェイス ベースのクライアント サーバー サービス フレームワークを使用できます。
たとえば、オープン ソースのmORMot フレームワークの最後の機能であるインターフェイス ベースのサービスのサンプル コードとこのリンクを参照してください。
interface
リモート プロセスで実行できます。この機能は、フレームワークのすべての通信手段、つまりインプロセス コール、GDI メッセージ、名前付きパイプ、および TCP/HTTP を処理します。内部的にはWM_COPYDATA
GDI メッセージに使用し、パラメータと結果を JSON として送信します。このリンクを使用して、ソース コード ( http://synopse.info/fossil 1.16+ バージョンを使用) とドキュメント (これらのサービスの実装方法に関するページがいくつかあります) をダウンロードします。
XE2 までの Delphi 6 で動作するオープン ソース プロジェクトです。
また、SOAP または DataSnap クライアント サーバー (対応するバージョンの Delphi がある場合)、または n 層の商用パッケージ ( http://www.remobjects.com/daなど) を使用してインターフェイスを公開することもできます。これは、mORMot で実装されているメソッドに似ています。
COM も Windows ネイティブですが、初期化がより困難です。各 PC に (管理者権限で) COM を登録する必要があり、ネットワーク経由で動作させることはできません。 (DCOM は非推奨です。覚えておいてください)。COM は、サービスを .Net などの他の言語とローカルでのみ共有したい場合に適しています。