1

在继续安装之前,我需要检查服务可执行版本。

我已经从注册表中读取了注册服务的完整路径:

    <Property Id="SOME_SERVICE_PATH">
       <RegistrySearch Id="FindServicePath" Type="raw" Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\TARGET_SERVICE" Name="ImagePath" />
    </Property>  

之后,我尝试执行如下文件搜索:

  <Property Id="TARGET_SERVICE_UNSUPPORTED">
    <DirectorySearch Id="ServiceParticularVersionSearch" Path="[SOME_SERVICE_PATH]">
        <FileSearch Name="Service.exe" MaxVersion="2.5.0.1"  /> 
    </DirectorySearch>
  </Property>

这并没有给我带来结果。

我想问题出在我传递给DirectorySearch Path属性的值上。根据 Wix 文档Path,应使用“用户系统上的路径。绝对或相对于包含目录的路径”进行初始化。不幸的是,注册表中没有我可以读取服务安装目录的位置。这是 3d 派对组件。

这里有什么解决方案吗?重要时刻 - 禁止在我们的项目中使用自定义操作

4

1 回答 1

1

事实证明,答案在元素Type参数中。RegistrySearch如果我将“文件”分配给它,我将能够应用FileSearch我读取的路径并检查可执行版本。这里的另一个解决方案是使用RegistrySearch Element 文档中的备注

文件

注册表值包含文件的路径。要返回完整的文件路径,您必须添加一个 FileSearch 元素作为该元素的子元素;否则,返回文件路径的父目录。

我的意思是“否则返回文件路径的父目录”

解决方案 1

  <Property Id="TARGET_SERVICE_UNSUPPORTED">
    <RegistrySearch Id="FindServicePath" Type="file" Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\TARGET_SERVICE" Name="ImagePath" />
        <FileSearch Name="Service.exe" MaxVersion="2.5.0.1"  /> 
    </DirectorySearch>
  </Property>

解决方案 2

<Property Id="SOME_SERVICE_PATH">
   <RegistrySearch Id="FindServicePath" Type="file" Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\TARGET_SERVICE" Name="ImagePath" />
</Property>

<Property Id="TARGET_SERVICE_UNSUPPORTED">
  <DirectorySearch Id="ServiceParticularVersionSearch" Path="[SOME_SERVICE_PATH]">
    <FileSearch Name="Service.exe" MaxVersion="2.5.0.1"  /> 
  </DirectorySearch>
</Property>    
于 2018-07-19T10:22:53.113 回答