0

プロセス外の ATL COM サーバー (exe) があります。クライアントによって開始されると、サーバーはいくつかのデータをポーリングするワーカー スレッドを生成します。データが更新されるたびに、すべてのクライアントに更新された値を通知したいと考えています。

CoCreateInstanceEx を介して接続し、Sink オブジェクトを作成し、接続ポイントを取得して Advise を呼び出す COM クライアントを作成しましたが、すべてエラーは発生しませんでした。ただし、サーバーが Fire_event を試行すると、IConnectionPointImpl::m_vec が空になり、クライアントに通知されません。

これは、サーバーが独自のオブジェクトを作成するためだと思われます。そのため、Advise を呼び出すと、IConnectionPointImpl::m_vec の 2 つのインスタンスが作成されます。1 つはサーバーから、もう 1 つはクライアントからです。サーバーのデータをクライアントに渡すにはどうすればよいですか?

4

1 に答える 1

0

このアプローチをお勧めします。プレーンなバニラ C++ シングルトン (COM オブジェクトではない) を作成します - と呼びましょうSS未処理のすべての COM オブジェクトへの弱い非AddRef'ed 参照のリストを保持します (COM インターフェイス ポインターではなく、C++ クラス ポインターが便利です)。COM オブジェクトはS、コンストラクターで自分自身を登録し、デストラクターで登録解除します。

何か興味深いことが起こると、ワーカー スレッドは (call a method on)Sに通知し、登録されているすべての COM オブジェクトに通知し、それFire_event自体を呼び出します。

ワーカー スレッドからイベントを発生させるときは注意してください。メイン スレッドとワーカー スレッドの両方が MTA に入らない限り、これは違法です。詳細といくつかの回避策については、http: //vcfaq.mvps.org/com/1.htmを参照してください。

于 2013-10-22T20:34:46.013 に答える