2010-08-26 51 views

回答

1

不,它不。

如果您無法正確釋放對進程外COM服務器的所有引用並正確關閉COM,則可能導致該服務的實例處於奇怪狀態(在釋放所有引用後,所有內容都應該正常,但有時COM可能會緩存部分進程封送層)。

一個進程外的COM服務可以被設計爲爲每個客戶端(在服務內部或跨服務)提供獨立的組件實例,它們是完全獨立的(即使託管在同一個進程中),在這種情況下很難看到一個客戶端的故障會影響其他實例(除了在實例上浪費內存,直到COM最終將其更新)之外。如果實例共享狀態,即使客戶端完全按照規則運行,它們當然也可能會產生干擾。

+0

COM服務可以爲所有客戶端提供唯一實例嗎? – COMer 2010-08-26 09:34:38

+0

@COMer如果你的意思是一個奇怪的例子(即只有一個實例,無論是1個還是1000個客戶端):是的。您需要重寫實例工廠(這取決於您如何創建COM組件,並且某些工具可能沒有足夠的靈活性來執行此操作)。 – Richard 2010-08-26 10:07:24

1

您引用該引用的來源非常重要,以便我們可以獲取上下文。就我所知,你從一本關於DirectShow編程的書中得到了這些。它實際上指的是需要調用CoUninitialize()。

是的,這很重要。一個線程在開始使用任何COM API函數之前應該調用CoInitializeEx()來初始化COM基礎結構。當線程結束時,您應該調用CoUninitialize(),以便正確清理內容。通常在程序的main()函數結束時。如果不這樣做,可能會導致其他應用程序發現其實際已死亡的註冊類工廠時失敗。

否則這樣做什麼也沒有與COM進程外服務器做任何事情都不得不限制自己。您可以使用CoRegisterClassObject()的REGCLS參數指定共享模式。當然,服務器應該不是退出並且調用CoUninitialize直到全部其對象被釋放。

相關問題