4

我有一个TheApp支持插件的主应用程序。应用程序 A 默认安装在$(ProgramFiles)\TheApp,但金牌拥有者希望这是用户可自定义的,因此其位置可能会根据安装时的用户输入而有所不同。

通过将插件复制到Packages安装目录下的子目录来安装插件。具体来说,不需要为要加载的包设置注册表设置,我试图尽可能地远离注册表。当然,如果用户在安装时更改了安装目录TheApp,插件也必须更改其安装位置以匹配。

这如何最好地完成?我不擅长使用 WiX 编写 MSI 安装程序,但我的第一次尝试可能是在TheApp安装时创建一个注册表项,保存其安装位置,然后让插件搜索注册表项。这迫使我创建注册表值,这是我尽可能避免的。但是,让我感到震惊的是,安装程序应该能够利用 Windows Installer 数据库来定位TheApp的安装目录。这将消除对注册表项的需要。

是否有关于如何进行这种安装程序间通信的“最佳实践”,特别是安装目录?鉴于两个安装程序都将使用 WiX 编写,通信会是什么样子?

4

3 回答 3

3

是的,您可以使用 Windows Installer 数据库,并且在某些条件下,无需自定义操作!

标准表格和操作支持搜索已安装的组件。因此,如果您的应用程序目录中安装了某个组件(例如,您的应用程序 .exe)并且您提供了固定的 GUID,那么您的插件安装程序可以找到它。

由于您在所有项目中都需要“MainComponentGuid”,因此将其作为文件提取define出来Include

插件创作:

<?include ../MainSetup/MainComponentGuid.wxi?>

<Property Id="MAINDIR">
  <ComponentSearch Id="MainComponentSearch" Type="file" Guid="$(var.MainComponentGuid)">
    <DirectorySearch Id="MainComponentDirectorySearch" AssignToProperty="yes"  Depth="0" />
  </ComponentSearch>
</Property>

<CustomAction Id="SetInstallFolder" Directory="INSTALLFOLDER" Value="[MAINDIR]" />
<InstallExecuteSequence>
  <Custom Action="SetInstallFolder" After="CostFinalize">NOT Installed</Custom>
</InstallExecuteSequence>

在您的目录结构中,您将创建Packages一个INSTALLFOLDER. 除非安装了主要产品,否则您也可以使用MAINDIRinLaunchCondition来防止安装插件。

于 2013-06-26T02:28:52.957 回答
1

在安装过程中编写注册表项,然后使用 WIX找到它非常简单。

您可以使用以下内容创建密钥:

<Component Id="RegistryEntries" Guid="PUT-GUID-HERE">
    <RegistryKey Root="HKCU"
                 Key="Software\MyApplicationName"
          Action="createAndRemoveOnUninstall">
     <RegistryValue Action="write"  Name="InstallDir" Type="string" Value="[INSTALLDIR]"  />
    </RegistryKey>
</Component>

InstallDir是设置用户选择的软件目标路径的 WIX 属性。一旦你有了这个密钥设置,你就可以使用以下示例在插件安装程序中查找它(假设有一个单独的插件安装程序):

<Property Id="AnyNameYouLike">
<RegistrySearch Id="YourRegistrySearchId"
                Root="HKCU"
                Key="Software\MyApplicationName"
                Name="InstallDir"
                Type="raw" />
</Property>

此代码将属性的值设置为AnyNameYouLike存储在InstallDir. 您可以在打算使用该路径之前将此代码放在某处。

或者,如果你真的想避免做注册表的事情,你可以在 WindowsProgramData\YourApp或文件夹中创建一个文件来存储安装位置。Users

于 2013-06-25T10:46:48.213 回答
0

1) 检查您的主产品是否在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 中写入 InstallLocation 键

2) 如果没有这样的键,设置ARPINSTALLLOCATION 属性

3) 如果密钥是由主产品写入的 - 只需使用 RegistryLocator 读取此值并设置 TARGETDIR。

于 2013-06-25T11:13:56.593 回答