0

2 つの exe がCOM (ActiveX?) インターフェイスを介して通信することは可能ですか? COM DLL は 2 つの別々のプロセス間でデータ共有を調整できますか?

4

6 に答える 6

1

2 つのプロセス間で通信する場合は、名前付きパイプを使用します。

(リモート COM オブジェクトを呼び出してデータを共有することは可能ですが、必要以上に複雑です。)

于 2009-08-22T19:02:19.470 に答える
1

あなたの質問に対する答えは、明らかにイエスです。

フォローアップは次のとおりです。

  1. なぜデータを共有したいのですか?何を達成しようとしていますか?データはどのように見えますか? 複雑な構造をマーシャリングして複雑な RPC 呼び出しを行う必要がありますか? それとも、メモリ内に大量のデータがあり、2 人でパーティーをしたいですか?
  2. COM が最適な方法だと思うのはなぜですか? ウィンドウメッセージを送信したり、名前付きパイプを使用したり (@avakar が提案)、名前付きミューテックスで共有メモリを使用したりすることを検討しましたか?

#1 への回答は #2 に通知されます。

ただし、COM が最適なソリューションであるとしましょう。プロセス A に、プロセス B で何かを実行したいコードがある場合、COM オブジェクトを b.exe に登録してから、プロセス A にそのオブジェクトを CoCreateInstance() させます。COM は b.exe を起動し、CoCreateInstance() に渡す CLSID によって指定されたオブジェクトを作成し、CoCreateInstance() の IID パラメータで要求した指定されたインターフェイスへのポインターを提供します。これで、プロセス A からプロセス B のオブジェクトのメソッドを呼び出すことができます。

さらに質問や説明がある場合は、お気軽にフォローアップしてください。

COM は、基本的なデータ型 (基本的に VARIANT がサポートするすべてのもの) をマーシャリングします。

于 2009-08-22T20:06:11.917 に答える
0

VB6で記述された簡単な例については、CoffeeMonitorの共有を参照してください。これは、単純な1対1のシナリオではなく、n-way通信におそらく最も役立ちます。

さらに別のアプローチは、名前付きパイプとは異なり、UDPブロードキャストと同様の方法でブロードキャストを使用できるメールスロットを使用することです。

于 2009-08-22T19:10:35.443 に答える
0

com dll は、2 つの別々のプロセス間でデータ共有を調整できますか?

注意: 各プロセスに 1 つずつ、その DLL の 2 つのインスタンスがあります。DLL がデータを持っている/管理している場合、DLL の各インスタンスは独自のデータを持ちます。そのデータはプロセス間で共有されません。

2 つの exe が com インターフェースを介して通信すること可能です。この場合、COM インターフェースは「わかりません」などのメソッドをサポートしていますが、putDataこのgetDataCOM オブジェクトをアウトオブプロセス ( *.exe) COM オブジェクトであり、インプロセス ( *.dll) COM オブジェクトとしてではありません。

または、DLL を使用する場合は、DLL の 2 つの別個のインスタンスに対処するためにそれらを実装する必要があります。たとえば、プロセス内クリティカル セクションではなくプロセス間ミューテックスを使用し、プロセス内ではなくプロセス間共有メモリを使用する必要があります。 -プライベート ヒープ メモリを処理します。

これは、データ共有を調整する最善の方法ではないかもしれませんが方法になる可能性があります。

于 2009-08-22T19:31:06.730 に答える
0

はい、2 つの exe が COM インターフェイスを介して通信することは可能です。

COM クライアントと COM サーバーは、同じプロセス、同じコンピューター上の 2 つの別個のプロセス、または 2 つの異なるコンピューター上に存在できます。

于 2009-08-22T19:44:54.627 に答える
0

DCOM (分散 COM) は、別のプロセス (またはマシン) で実行されている COM オブジェクトと通信するためのテクノロジです。シナリオを詳しく説明していただけると助かりますが、やろうとしていることにより適したオプションがあるかもしれません。

于 2009-08-22T20:11:51.670 に答える