2010-08-03 53 views
2

我有一個windows服務,它在初始化過程中產生多個COM +調用。在某些系統上,這個Windows服務在啓動時會導致死鎖。在服務啓動期間調用CoCreateInstance

至少一個服務或驅動程序在系統啓動

過程中失敗,在服務啓動過程調用CoCreateInstance的問題是,它可能需要其他服務啓動。在等待當前服務進入運行狀態時,SCM不會允許其他服務啓動。解決方案是確保在安裝服務時正確配置服務依賴關係。請參閱http://support.microsoft.com/kb/258943

但是,在Windows Vista/2008/7上運行時應指定哪些服務依賴關係?

回答

2

簡單的解決方案是配置您的COM應用程序服務使服務啓動設置爲「自動(延遲啓動)」(DelayedAutoStart)。那麼它將不會成爲Windows運行所需的「基本」服務的一部分。它是與Windows 2008一起推出的。

3

另一種解決方案是在服務啓動邏輯期間不要初始化您的COM對象。讓啓動邏輯創建一個單獨的工作者線程,或者至少對自己創建一個延遲/排隊請求,以便可以在SCM被釋放以根據需要啓動其他服務之後完成COM初始化。

+0

服務啓動實際上應該幾乎不包含任何內容。 'DllMain'應該避免大部分系統調用。 – 2010-11-29 21:53:36

+0

是的,這也是我最終實施的非解決方案。我喜歡服務無法啓動的想法,而不是開始成功但隨後停止的服務。但這顯然是不可能的。 – 2010-11-30 11:05:01

+0

不是當你必須處理服務依賴,沒有。 – 2010-12-01 21:03:38