我正在创建一个WiX安装程序项目,我希望安装程序检查是否已经在用户的计算机上安装了另一个应用程序。如果是,那么我想将其中一个功能的安装级别设置为“1”,否则它应保持隐藏状态(即安装级别= 0)。要找出安装应用程序的位置,我首先进行注册表搜索:
<Property Id="MYAPPINSTALLFOLDER">
<RegistrySearch Id='InstallPathRegistry'
Type='raw'
Root='HKLM'
Key='SOFTWARE\SomeLongAppPath' Name='FileName'
Win64='yes'/>
</Property>
你会注意到我最终得到的注册表值实际上是已安装应用程序的目录,包括带扩展名的实际程序名称(比方说myapp.exe)。因此,一旦我获得已安装应用程序的完整路径,我会检查该文件是否存在:
<Property Id="MYAPPINSTALLED">
<DirectorySearch Id="CheckFileDir" Path="[MYAPPINSTALLFOLDER]" AssignToProperty="yes">
<FileSearch Id="CheckFile" Name="myapp.exe" />
</DirectorySearch>
</Property>
现在,我希望看到的是,如果文件实际存在于该位置,那么名为“MYAPPINSTALLED”的属性将被设置为1,否则它将为0.然后,当我设置我的功能时,我使用像这样的东西:
<Feature Id="ThirdPartyPlugins" Title="Third Party Plugins" Level="0">
<Condition Level="1">MYAPPINSTALLED</Condition>
<ComponentGroupRef Id="MyAppPlugin" />
</Feature>
但是,当我运行安装程序时,第三方插件功能始终处于隐藏状态。我通过设置如下属性来启用msi数据记录:
<Property Id="MsiLogging" Value="voicewarmupx"/>
当我检查日志文件时,我确实可以看到MYAPPINSTALLFOLDER属性在进行注册表搜索时被更改为正确的文件路径。但是,如果我在日志中搜索属性MYAPPINSTALLED,那么我可以看到以下内容:
AppSearch: Property: MYAPPINSTALLED, Signature: CheckFileDir
Action ended 15:55:06: AppSearch. Return value 1.
所以,看起来它有效,但它似乎没有将Property设置为等于搜索值。难道我做错了什么?有人可以解释为什么我的功能安装级别永远不会设置为1,即使应用程序文件存在吗?
修改
好的,经过更多的调试......我认为问题是目录搜索试图使用包含文件名和扩展名的路径(即C:/ Program Files / MyApp / myapp.exe“)而不是只是文件来自的目录。这是因为注册表搜索有完整的路径,包括存储的文件名(但不仅仅是安装目录)。如果我只使用正确的绝对目录进行目录搜索(不使用注册表)搜索)然后这个过程有效。所以,我的后续问题是......我的属性MYAPPINSTALLFOLDER包含文件名和扩展名的完整路径。有没有办法从这个属性中删除文件名和扩展名,这样我就可以了要搜索的正确目录名称?
答案 0 :(得分:1)
您正在检查是否安装了其他应用程序,但这还有很长的路要走。此外,文件搜索返回一个路径,而不是零或1,但无论如何,完整的详细日志应该告诉您是否正在设置属性。如果您可以将整个日志发布到某个地方而不是您认为唯一相关的部分,这可能会有所帮助。例如在静默安装的执行顺序中可能存在AppSearch。
通过以下方式对使用MSI软件包安装的其他应用程序进行单一搜索非常容易:
如果您知道其他产品的UpgradeCode(以及版本范围,如果适用),则添加仅将检测设置为yes的Upgrade / UpgradeVersion元素,并且如果检测到产品,该搜索将设置属性。
如果您知道(或可以找到)该其他产品中任何相关组件的组件ID,则可以在WiX ComponentSearch中使用它们。如果获得目标属性集,则安装该组件。这篇文章包含了几种查找组件guid的方法: How to find out which application requires a certain assembly from GAC?
令人费解的是,您发布的AppSearch日志提取仅涉及一个属性。 Directory / FileSearch也是AppSearch,因此如果MSI实际上在AppSearch中包含两个搜索,则应该引用所有正在设置的属性。同样,这是发布整个日志并在MSI文件中查找这些搜索的原因。 RegLocator搜索是在DRLocator之前进行的,因此为什么AppSearch日志条目中没有MYAPPINSTALLFOLDER属性?你不是32位系统吗? (注意到win64搜索)。