我正在处理循环依赖项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可能不存在
我明白你的问题,但是我不明白的部分是“我用C++写了一个Windows服务,这个服务依赖于第一次加载/使用时安装驱动程序的DLL; DLL使用司机在运行期间“。 - 听起来像是一个非常糟糕的设计选择,这会导致你很多问题。启动服务不应启动任何安装过程。你为什么这样做?我会说摆脱你的服务所做的任何安装,并开始使用WiX的全部功能。 – 2014-10-09 20:41:16
另外WiX试图启动你的依赖听起来不对。它不应该启动任何东西。它只应该安装您的服务所依赖的必要驱动程序/ DLL。而已。 – 2014-10-09 20:45:51
@ChrisEelmaa对不起,这部分不清楚,也许我可以澄清一下:在DLL中有一个'.sys'驱动文件。在第一次使用DLL时,如果系统中没有'.sys'文件,那么DLL将其解压缩并写入磁盘 - 它不会启动另一个安装程序或其他任何东西。以这种方式做事的选择不是我的,而是第三方DLL的作者。我想我可以从它已经安装的系统上获取'.sys'文件,并让WiX将它安装到正确的位置;我得看看这个。 – paul 2014-10-10 12:21:33