2013-10-22 127 views
0

我有一個進程外ATL COM服務器(exe)。當它由客戶端啓動時,服務器產生一個工作線程輪詢一些數據。每次數據更新時,我都想通知所有客戶端更新的值。OOP COM服務器更新客戶端

我已經創建了一個COM客戶端,它通過CoCreateInstanceEx連接,創建它的Sink對象,獲取連接點並調用Advise,全部沒有錯誤。但是,當服務器嘗試Fire_event時,它的IConnectionPointImpl :: m_vec爲空,並且不會通知客戶端。

我認爲這是因爲服務器創建自己的對象,所以我最終得到兩個IConnectionPointImpl :: m_vec實例,一個來自服務器,另一個來自客戶端調用Advise時。我怎樣才能獲得服務器數據給客戶端?

+1

我想你必須找出事件爲什麼被觸發的對象不同於爲客戶端創建的對象,以及爲什麼有多個對象放在首位。 – sharptooth

回答

0

我推薦這種方法。創建一個普通的香草C++單例(不是COM對象) - 我們稱之爲S。對於所有未完成的COM對象(C++類指針,而不是COM接口指針,將會很方便),將引用弱引用列表。你的COM對象將在其構造函數中註冊爲S,並在析構函數中註銷。

當一些有趣的事情發生時,你的工作線程會通知(調用一個方法)S,它會通知所有已註冊的COM對象,它們自己會調用Fire_event

從工作線程發起事件時要小心。這是非法的,除非你的主線程和工作線程都進入MTA。有關詳細信息和一些解決方法,請參閱http://vcfaq.mvps.org/com/1.htm