2014-10-09 24 views
0

我正在處理循環依賴項w.r.t. Windows服務及其對驅動程序的依賴。情況如下:如何在安裝服務時定義此依賴項

我用C++寫了一個Windows服務。該服務依賴於第一次加載/使用時安裝驅動程序的DLL;該DLL在操作期間使用該驅動程序。

在早期測試中,我會通過命令行調用/INSTALL標誌來安裝服務可執行文件 - 這將在內部調用InstallService

然後,我遇到了一個問題:當我手動啓動它的服務將運行,但是當它被設置爲自動運行開機後已加載的驅動程序之前,將啓動,它會因爲這個錯誤。

爲了解決這個問題,我在服務的註冊表項@HKLM\System\CurrentControlSet\Services\<SERVICE>DependOnService值中設置了驅動程序對服務的依賴關係(Windows對待類似於服務的驅動程序)。這解決了這個問題。

快進到部署:我使用WiX的安裝和啓動服務。在安裝過程中,我想將驅動程序設置爲我的服務的依賴項。但是,如果我將驅動程序定義爲ServiceInstall元素中的依賴項,那麼WiX會在啓動我的服務之前嘗試啓動它,因此我的問題是:如果不啓動依賴項,則WiX無法啓動該服務,並且依賴項不存在,因爲服務尚未運行。

如果我不指定安裝程序配置文件中的相關性則服務安裝並運行良好。

我想,我可以像以前一樣安裝該服務,在註冊表中後確定的依賴性,但有一個爲那裏的服務沒有進入!

另一件事:服務現在開機後運行!沒有定義依賴關係!我沒有做過多少測試,看看這是否一致。

那麼,如何威克斯告訴Windows,有一個服務,即爲什麼沒有註冊表項?我如何指定依賴關係?我還需要需要指定一個嗎?我是否應該放棄使用與WiX服務相關的元素,並在安裝程序中手動執行測試期間執行的命令?

我一直在摔跤這個和研究至少一個星期;任何見解將不勝感激。


環境信息:

  • 開發:Windows 7中,32位
  • Visual Studio 2010中
  • WiX的V3.8
  • 部署:Windows 7 32位和64位 - 定製,拆卸圖像 so something stand ARD可能不存在
+0

我明白你的問題,但是我不明白的部分是「我用C++寫了一個Windows服務,這個服務依賴於第一次加載/使用時安裝驅動程序的DLL; DLL使用司機在運行期間「。 - 聽起來像是一個非常糟糕的設計選擇,這會導致你很多問題。啓動服務不應啓動任何安裝過程。你爲什麼這樣做?我會說擺脫你的服務所做的任何安裝,並開始使用WiX的全部功能。 – 2014-10-09 20:41:16

+0

另外WiX試圖啓動你的依賴聽起來不對。它不應該啓動任何東西。它只應該安裝您的服務所依賴的必要驅動程序/ DLL。而已。 – 2014-10-09 20:45:51

+0

@ChrisEelmaa對不起,這部分不清楚,也許我可以澄清一下:在DLL中有一個'.sys'驅動文件。在第一次使用DLL時,如果系統中沒有'.sys'文件,那麼DLL將其解壓縮並寫入磁盤 - 它不會啓動另一個安裝程序或其他任何東西。以這種方式做事的選擇不是我的,而是第三方DLL的作者。我想我可以從它已經安裝的系統上獲取'.sys'文件,並讓WiX將它安裝到正確的位置;我得看看這個。 – paul 2014-10-10 12:21:33

回答

1

我找到了解決辦法。

大部分的問題是一個RTFM問題(雖然我的辯護文件是不是所有的明確):

我一直在使用一個通用名稱ServiceInstall元素的Name屬性的值 - 我在這樣的印象中,這被用於將ServiceInstall元件鏈接到ServiceControl元件。

ServiceInstall元素的文件說,下面講Name屬性:

此列,使該服務名安裝的字符串。

ServiceControl元素的文件說:

服務的名稱。

Name屬性的值的實際用法是該服務的隱藏的系統名稱;這是在註冊表中使用的名稱HKLM\System\CurrentControlSet\Services。我的服務因此被安裝在ServiceManagement密鑰下,因爲這就是我在Name屬性中所具有的。

不同的名字是什麼導致東西依賴工作。顯然,除非依賴關係,Windows按字母順序加載服務(請參閱關於this answer的評論)。當我手動安裝時,我的服務的名稱早於驅動程序的名稱,因此在未指定依賴關係時發生錯誤。我在WiX項目的Name屬性中指定的通用名稱在驅動程序的服務名稱爲之後出現,因此驅動程序在我的服務被加載之前已加載。

我最終做的是將Name切換回服務的正確名稱,然後將RegistryValue添加到WiX項目,以指定我的服務對驅動程序(服務)的依賴性。

相關問題