在安装之前,我需要检查服务可执行版本。
我已经从注册表中读取了注册服务的完整路径:
<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派对组件。
这里有什么解决方案吗?重要时刻-禁止在我们的项目中使用自定义操作
答案 0 :(得分:1)
事实证明,答案在Type
元素的RegistrySearch
参数中。如果我给它分配“文件”,我将能够在读取的路径上应用FileSearch
并检查可执行文件的版本。
这里的另一个解决方案是使用RegistrySearch Element documentation
文件
注册表值包含文件的路径。要返回完整的文件路径,您必须添加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>