代码之家  ›  专栏  ›  技术社区  ›  Vuwox

wix-在安装循环中搜索密钥

  •  1
  • Vuwox  · 技术社区  · 6 年前

    我的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,我不想为这个版本专门创建安装程序。我要搜索注册表: Software\Adobe\Photoshop 并循环每个潜在版本(如上述情况中的110.0和120.0)。

    所以我的问题是:

    1)是否可以使用 <?foreach?> 是吗?

    2)是否有一种方法可以让单个componentgroupref指向同一个文件,但我希望将它们复制到不同的目录中?因为现在我为每个版本定义了两次相同的组件。

    如果用wix语言不可能做到这一点,有没有一种方法可以使用自定义操作来做到这一点?(如果有人能指点我该如何做这件事,我从来没有做过任何习惯性的行为,这是值得赞赏的)。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Stein Åsmul    6 年前

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


    循环 :我不知道有任何内置的msi构造可以循环访问注册表项。我相信你必须采取一种习惯性的行动来达到这个目的。

    自定义操作 :自定义操作可以是 EXE files (本地、托管) C++ dll (本地) C# / VB dll (管理) ActiveScripting ( JavaScript ,请 VBScript )甚至有些用途 Powershell (我不会)。 你选择的语言是什么? C++ DLL是迄今为止最可靠的(运行时要求、可调试性等),如果您可以首先处理C++复杂度。经验法则: 静态链接 尽你所能。有时,自定义操作是唯一的选择, be careful though (针对不必要的案件)。WIX中有一些C++和托管代码自定义操作模板 Visual Studio Extension ( 试试这个吧 -安装扩展,并通过Visual Studio中的“新建项目”对话框调用。也许还有 quickly check this .

    已经有一段时间没有阅读过这些内容,但要确保您拥有这些内容:

    C++调试 使用C++,您只需在要调试的自定义操作函数中显示消息框,然后将调试器附加到弹出的消息框。基本上只是依附于 msiexec.exe -用户上下文1或系统上下文1取决于自定义操作的顺序。即时,完全调试。

    托管CA调试 :对于托管代码,还显示来自自定义操作的消息框,然后附加到 rundll32.exe 运行托管代码的进程。这是一个很好的视频 Advanced Installer 演示如何执行此操作: Debug C# Custom Actions .

    文件复制 :不是我最喜欢的概念,但您可以尝试 CopyFile MSI的功能如下所述: 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。笨重,我知道。