【问题标题】:Wix - Search for keys in loop for installationWix - 在循环中搜索密钥以进行安装
【发布时间】:2018-06-22 13:54:36
【问题描述】:

我的 wix 代码如下所示:

<!-- CC 2017 = Version 110.0 -->
<Property Id="ISCC2017EXISTX64">
    <RegistrySearch Id="IsCC2017Existx64" Root="HKLM" Key="Software\Adobe\Photoshop\110.0" Name="ApplicationPath" Win64="yes" Type="raw" />
</Property>

<Property Id="ISCC2017EXISTX32">
    <RegistrySearch Id="IsCC2017Existx32" Root="HKLM" Key="Software\Adobe\Photoshop\110.0" Name="ApplicationPath" Win64="no" Type="raw" />
</Property>


<!-- CC 2018 = Version 120.0 -->
<Property Id="ISCC2018EXISTX64">
    <RegistrySearch Id="IsCC2018Existx64" Root="HKLM" Key="Software\Adobe\Photoshop\120.0" Name="ApplicationPath" Win64="yes" Type="raw" />
</Property>

<Property Id="ISCC2018EXISTX32">
    <RegistrySearch Id="IsCC2018Existx32" Root="HKLM" Key="Software\Adobe\Photoshop\120.0" Name="ApplicationPath" Win64="no" Type="raw" />
</Property>

我在哪里搜索以了解计算机上是否安装了 Photoshop CC 2017 或 CC 2018。如果是这样,我可以安装以下功能:

    <Feature Id="FEATURE_EXTENSION_CC2017" Title="CC 2017" Description="Install KEY36 for CC 2017" Level="0">
        <Condition Level="1">ISCC2017EXISTX64</Condition>
        <ComponentGroupRef Id="CG_CC2017" />
    </Feature>

    <Feature Id="FEATURE_EXTENSION_CC2018" Title="CC 2018" Description="Install KEY36 for CC 2018" Level="0">
        <Condition Level="1">ISCC2018EXISTX64</Condition>
        <ComponentGroupRef Id="CG_CC2018" />
    </Feature>

所以明年 Photoshop 将发布 Photoshop CC 2019,我不想专门为这个版本创建安装程序。我想搜索 Registry : Software\Adobe\Photoshop 并遍历每个可能的版本(如上例中的 110.0 和 120.0)。

所以我的问题是:

1) 有没有办法使用&lt;?foreach?&gt; 循环所有子注册表项?

2) 有没有办法让一个 ComponentGroupRef 指向同一个文件,但我希望它们被复制到不同的目录中?因为现在我为每个版本定义了两次相同的组件。

如果使用 Wix 语言无法做到这一点,有没有办法使用自定义操作来做到这一点? (如果有人能指出我应该如何做这样的事情,我从来没有做过任何自定义操作。

【问题讨论】:

  • 看来你想寄希望于未来的形状。你可以像过去一样硬核它。更多的条目会让你领先几年。如果你不喜欢编写重复的代码,你可以生成它。 (另一方面,每个新版本都是与您的用户建立联系的机会。)

标签: installation wix windows-installer registry


【解决方案1】:

总体:很难为“未来”创建设置。事情有一种完全改变的方式,所以你支持目前未知的东西的好计划被浪费了(他们开始使用完全不同的键,或者用整个应用程序去UWP)。您最好放弃此愿望清单支持,并在时机成熟时编译新设置。我的两分钱。


循环:我不知道有任何内置的 MSI 构造来循环注册表项。我相信您必须借助自定义操作来实现这一目标。

自定义操作:自定义操作可以是 EXE files(本机、托管)、C++ dll(本机)、C# / VB dll(托管)、@987654338 @(JavaScriptVBScript),有些人甚至使用Powershell(我不会)。 你选择什么语言?如果你能首先处理 C++ 的复杂性,C++ dll 是迄今为止最可靠的(运行时要求、可调试性等)。经验法则:尽可能静态链接。有时自定义操作是唯一的选择,be careful though(针对不必要 CA 的情况)。 WiX 在其Visual Studio Extension 中有一些 C++ 和托管代码自定义操作模板(请尝试这些 - 安装扩展,并通过 Visual Studio 中的新项目对话框调用)。也许还有quickly check this

有一段时间没有阅读这些,但想确保您拥有它们:

C++ CA 调试:使用 C++,您只需在要调试的自定义操作函数中显示一个消息框,然后只需将调试器附加到弹出的消息框。本质上只是附加到msiexec.exe - 用户上下文一或系统上下文一,具体取决于您的自定义操作的排序方式。即时、全面的可调试性。

托管 CA 调试:对于托管代码,您还会显示自定义操作的消息框,然后附加到 rundll32.exe运行托管代码的进程。这是来自Advanced Installer 的精彩视频,向您展示了如何做到这一点:Debug C# Custom Actions

文件复制:不是我最喜欢的概念,但您可以尝试 MSI 的 CopyFile 功能,如下所述:WiX Installer - Run an MSI multiple times with different properties? 请务必检查实际WiX 资源以了解它的整体概念。这是另一个类似的答案:WIX: copy file to custom dir in another partition。值得一试。不是火箭科学,但我觉得它很繁琐。但是 Chris 的完整示例代码应该可以帮助您。

功能级别 0:在将功能级别设置为 0 时,我发现了一个意外问题。此处描述:Failing condition wix基本上:出现设置为0 级别的功能 在administrative installation 期间不会被提取。当我看到它时,我发现这很难相信,现在我仍然相信,但测试表明确实如此。 这可能会导致您的应用程序在企业环境中的使用出现问题(它们在很大程度上依赖于 administrative installations)。解决方案?我反过来:将功能安装级别默认设置为 1,如果功能条件为真,则将其更改为 0。笨拙,我知道。

【讨论】:

  • 感谢所有这些链接,我将四处浏览,看看我能找到什么。我知道这可能是一个难以处理的未来软件。但通过研究,我发现当前的 Photoshop(2013 到 2018 年)正在使用共享文件夹作为他们的插件。所以我可以安装在那个文件夹中,并希望他们在 2019+ 年仍会使用该功能。所以我的安装程序应该只处理该特定文件夹中的安装。但我仍然有兴趣安装到特定文件夹中以获得不同的配置文件。再次感谢,我会测试这些,如果工作我会接受那个答案。
  • 我觉得 MSI for 循环在 WiX 中无法正常工作,但我会再检查一下。我只是不想在它上面投入太多时间,我可以像我已经为几个版本所做的那样,一个一个地添加未来的软件。
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 2016-04-01
  • 2013-09-22
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2019-08-28
  • 2018-06-19
相关资源
最近更新 更多