我正在为可以作为主程序的一部分安装或独立安装的实用程序安装程序。主程序在当前注册表项中的位置。如果安装了主程序,则应将该实用程序安装在“Utilities”子目录中。例如D:\ Program Files(x86)\ MainProgram \ Utilities。如果未安装主程序,则它应默认为根驱动器文件夹,例如C:\ Program Files(x86)\ MainProgram \ Utilities。
安装应获取注册表项(例如HKLM \ Software \ MainProgram \ Key:“Install_location”)。这将给出一个直到d:\ Program File(x86)\ MainProgram的路径。该实用程序应直接安装在其子目录中。如果密钥不存在,则应默认为标准位置。
答案 0 :(得分:1)
使用C#或其他语言从自定义操作中读取注册表值,并检查密钥是否存在,否则您可以使用WIX查找是否存在注册表项。
RegistryKey regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"Software\MainProgram\Key");
if ((string)Registry.GetValue(regKey, "Install_location", "0") != "0")
{
session["Somevariable"] = (string)Registry.GetValue(regKey, "Install_location")
}
使用WIX
<Property Id="INSTALLLOCATION">
<RegistrySearch Id="INSTALLLOCATION"
Name="Install_location"
Root="HKLM"
Key="Software\MainProgram\Key"
Type="raw" />
</Property>
根据WIX会话变量的值,您可以决定安装位置并在所需路径上安装该实用程序。
答案 1 :(得分:1)
将MainProgram位置读入属性:
<Property Id="MainProgramDir">
<RegistrySearch Id="FindMainProgramDir"
Root="HKLM"
Key="Software\MainProgram"
Name="Install_location"
Type="directory" />
</Property>
并设置默认行为的目录结构:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="MainProgramDir" Name="MainProgram">
<Directory Id="INSTALLDIR" Name="Utilities"/>
</Directory>
</Directory>
</Directory>
目录元素与属性类似,如果存在具有相同Id的属性,则会覆盖它们。如果未设置该属性(因为RegistrySearch失败),那么它将在您设置的目录结构中定义。