Windows services 安装服务时如何定义此依赖关系

Windows services 安装服务时如何定义此依赖关系,windows-services,wix,dependencies,circular-dependency,Windows Services,Wix,Dependencies,Circular Dependency,我正在处理一个循环依赖,即Windows服务及其对驱动程序的依赖。情况如下: 我在C++中编写了一个Windows服务。此服务依赖于DLL,该DLL在第一次加载/使用驱动程序时安装驱动程序;DLL在此后的操作过程中使用驱动程序 在早期测试中,我将通过对带有/install标志的服务可执行文件的命令行调用来安装服务——这将在内部调用InstallService 然后我遇到了一个问题:当我手动启动服务时,它会运行,但当它被设置为在启动后自动运行时,它会在加载驱动程序之前启动,并且会因此出错 为了解决

我正在处理一个循环依赖,即Windows服务及其对驱动程序的依赖。情况如下:

我在C++中编写了一个Windows服务。此服务依赖于DLL,该DLL在第一次加载/使用驱动程序时安装驱动程序;DLL在此后的操作过程中使用驱动程序

在早期测试中,我将通过对带有
/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
      文件指定为服务的依赖项。描述中说:
      必须在父服务之前启动的服务或服务组。
      所以我想