Windows services 安装服务时如何定义此依赖关系
我正在处理一个循环依赖,即Windows服务及其对驱动程序的依赖。情况如下: 我在C++中编写了一个Windows服务。此服务依赖于DLL,该DLL在第一次加载/使用驱动程序时安装驱动程序;DLL在此后的操作过程中使用驱动程序 在早期测试中,我将通过对带有Windows services 安装服务时如何定义此依赖关系,windows-services,wix,dependencies,circular-dependency,Windows Services,Wix,Dependencies,Circular Dependency,我正在处理一个循环依赖,即Windows服务及其对驱动程序的依赖。情况如下: 我在C++中编写了一个Windows服务。此服务依赖于DLL,该DLL在第一次加载/使用驱动程序时安装驱动程序;DLL在此后的操作过程中使用驱动程序 在早期测试中,我将通过对带有/install标志的服务可执行文件的命令行调用来安装服务——这将在内部调用InstallService 然后我遇到了一个问题:当我手动启动服务时,它会运行,但当它被设置为在启动后自动运行时,它会在加载驱动程序之前启动,并且会因此出错 为了解决
/install
标志的服务可执行文件的命令行调用来安装服务——这将在内部调用InstallService
然后我遇到了一个问题:当我手动启动服务时,它会运行,但当它被设置为在启动后自动运行时,它会在加载驱动程序之前启动,并且会因此出错
为了解决这个问题,我在服务的注册表项@HKLM\System\CurrentControlSet\services\
的DependOnService
值中为服务设置了对驱动程序的依赖关系——Windows将驱动程序与服务类似。这解决了这个问题
快速部署:我正在使用WiX安装和启动服务。在安装过程中,我希望将驱动程序设置为我的服务的依赖项。但是,如果我在ServiceInstall
元素中将驱动程序定义为依赖项,那么WiX会在启动我的服务之前尝试启动它,因此我的问题是:WiX无法在不启动依赖项的情况下启动服务,并且依赖项不存在,因为服务尚未运行
如果我没有在安装程序配置文件中指定依赖项,那么服务将安装并正常运行
我想我可以在安装服务后,像以前一样在注册表中定义依赖项,但是那里没有服务的条目
另一件事:服务在启动后立即运行!没有定义依赖项!我还没有做过很多测试来看看这是否一致
那么,WiX如何告诉Windows有服务,即为什么没有注册表项?如何指定依赖关系?我还需要再指定一个吗?我是否应该放弃使用WiX服务相关元素,在安装程序中手动运行测试期间执行的命令
我已经努力研究了至少一个星期;如有任何见解,将不胜感激
环境信息:
- 开发:Windows7,32位
- VisualStudio2010
- wixv3.8
- 部署:Windows 7、32位和64位--自定义精简映像,因此可能不存在标准映像
- 我找到了解决办法
大部分问题都是RTFM问题(尽管我认为文档不是很清楚):
我一直在使用一个通用名称作为
ServiceInstall
元素的name
属性的值——我的印象是这是用来将ServiceInstall
元素链接到ServiceControl
元素的
ServiceInstall
元素的文档说明了有关Name
属性的以下内容:
此列是提供要安装的服务名称的字符串
ServiceControl
元素的文档说明:
服务的名称
Name
属性值的实际用途是服务的隐藏系统名称;这是注册表中在HKLM\System\CurrentControlSet\Services
下使用的名称。因此,我的服务是在ServiceManagement
键下安装的,因为这是我在Name
属性中所拥有的
不同的名称是导致事情按依赖关系运行的原因。显然,除了依赖项之外,Windows按字母顺序加载服务(请参阅上的注释)。当我手动安装时,我的服务的名称位于驱动程序的名称之前,因此当未指定依赖项时,它会出错。我在WiX项目的name
属性中指定的通用名称位于驱动程序的服务名称之后,因此驱动程序是在我的服务被加载之前被加载的
我最后做的是将
名称
切换回服务的正确名称,然后向WiX项目添加注册表值
,以指定我的服务对驱动程序(服务)的依赖性。我理解您的问题,但我不理解的是这一部分“我用C++编写了Windows服务。此服务依赖于DLL,该DLL在第一次加载/使用驱动程序时安装驱动程序;DLL在此后的操作过程中使用驱动程序。“-听起来这是一个非常糟糕的设计选择,给你带来了很多问题。启动服务不应启动任何安装过程。你为什么那样做?我想说的是,去掉你的服务所做的任何安装,开始使用WiX的全部功能。另外,WiX试图启动你的依赖项听起来是错误的。它不应该启动任何东西。它只应该安装服务所依赖的必要驱动程序/DLL。就是这样。@ChrisEelmaa很抱歉这部分不清楚,也许我可以澄清一下:DLL中打包了一个.sys
驱动程序文件。第一次使用DLL时,如果系统上不存在该.sys
文件,则DLL会将其解压并写入磁盘—它不会启动其他安装程序或任何东西。这样做不是我的选择,而是第三方DLL的作者的选择。我想我可以从一个已经安装了.sys
文件的系统中获取该文件,并让WiX将其安装到正确的位置;我必须对此进行研究。@ChrisEelmaa我使用ServiceInstall
元素中的元素将.sys
文件指定为服务的依赖项。描述中说:必须在父服务之前启动的服务或服务组。
所以我想