2014-10-09 41 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项目,以指定我的服务对驱动程序(服务)的依赖性。

相关问题