%programfiles%未在wix注册表搜索中扩展

时间:2016-11-17 11:21:28

标签: wix registry

我正在使用wix注册表搜索,以便找到我尝试集成的程序的插件目录。注册表项的值如下所示:

%PROGRAMFILES%\Product\Plugins

当我使用type =" raw"进行注册表搜索时像这样:

<Property Id="PLUGINDIR_STRING">
  <RegistrySearch Id="PluginDirSearchString"
                  Root="HKLM"
                  Key="$(var.PluginDirRegKey)"
                  Name="$(var.PluginDirRegKeyName)"
                  Type="raw"
                  Win64="yes" />
</Property>

我会得到确切的字符串。

当我像这样使用类型目录时:

<Property Id="PLUGINDIR">
  <RegistrySearch Id="PluginDirSearch"
                  Root="HKLM"
                  Key="$(var.PluginDirRegKey)"
                  Name="$(var.PluginDirRegKeyName)"
                  Type="directory"
                  Win64="yes" />
</Property>

我会得到一个空字符串。我正在检查这样的值:

<Condition Message='plugin dir "[PLUGINDIR_STRING]" found using registry key "$(var.PluginDirRegKey)" is not a valid path, make sure the path exist'>PLUGINDIR_STRING AND NOT PLUGINDIR</Condition>

<Condition Message='Unable to find registry key "$(var.PluginDirRegKey)", make sure $(var.PRODUCT) is installed'>PLUGINDIR_STRING</Condition>

显示第一条消息,表示找到了PLUGINDIR_STRING,但未找到PLUGINDIR。我认为目录选项应该扩展%programfiles%?如何正确处理这样的注册表值?

%PROGRAMFILES%\Product\Plugins

2 个答案:

答案 0 :(得分:0)

原始搜索与目录搜索的工作方式不同。原始搜索返回注册表项中的值。目录搜索检索该值然后检查该注册表是否存在 - 它实际上是对该注册表项中的目录的目录搜索,如果它不存在,则它不会设置属性值。我们的想法是,如果您想将该目录用作安装位置,它会告诉您它不存在。

无论如何,详细日志应验证是否正在进行 - 查看AppSearch,您可能会发现1314错误,表示该注册表项中的目录不存在。

我无法重现您所看到的错误。原始和目录注册表搜索都正在正确地扩展%programfiles%。您正在做的其他所有事情似乎都是正确的,因此您失败的目录搜索最可能出现的问题是您的设置是32位设置,并且您正在尝试查找64位目录。您在32位安装中的AppSearch将在您的注册表项中找到%programfiles%字符串,但它将调用WIN64DUALFOLDERS,并在ProgramFiles(x86)文件夹中搜索该目录。如果目录不存在,您将看到返回的空属性值。

答案 1 :(得分:-1)

使用定义良好的MSI属性获取程序文件的位置。

您可以找到明确定义的属性列表here

因此请将您的媒体资源设为[ProgramFilesFolder]\Product\Plugins。还有ProgramFiles64Folder但是从你提供的片段中我无法分辨你应该使用哪一个。理想情况下,您使用32位安装程序安装到32位操作系统上的程序文件和64位操作系统上的程序文件(x86)上,并使用64位安装程序安装到64位程序文件中OS。