2013-08-17 59 views
1

我創建了一個COM對象服務器exe,它實現一個COM對象,並調用CoRegisterClassObject,然後長時間睡眠(以防止該過程退出)創建由COM本地服務器實現的對象實例凍結

它運行後,我還有一個COM客戶端的exe它要求與CoRegisterClassObject以前註冊的對象的CLSID給CoCreateInstance的,

CoCreateInstance的凍結線程,但如果我關閉了COM服務器的過程 - 然後CoCreateInstance的立即返回「班級未註冊」。

你們有沒有人知道發生了什麼事?

謝謝。

回答

1

然後睡了很長時間(以防止該處理從離開)

據稱,服務器側對象居住在STA,這又需要消息泵/調度它的螺紋是在良好的信譽。通過睡在那裏凍結線程會阻止它的操作。客戶端進程等待與服務器進程/公寓的通信,並且預計也會鎖定。

你需要一個消息泵循環,以取代Sleep電話:

MSG Message; 
    while(GetMessage(&Message, NULL, WM_NULL, WM_NULL) > 0) 
    { 
     TranslateMessage(&Message); 
     DispatchMessage(&Message); 
    } 

一個典型的進程退出預防是優秀的對外COM引用量定期檢查。如果計數器大於零,並在檢查時刻爲零 - 那麼現在是退出的好時機。

+0

太棒了!我不知道COM使用窗口消息進行進程之間的通信。 – Taru