Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation Wix-在安装循环中搜索密钥_Installation_Wix_Windows Installer_Registry - Fatal编程技术网

Installation Wix-在安装循环中搜索密钥

Installation Wix-在安装循环中搜索密钥,installation,wix,windows-installer,registry,Installation,Wix,Windows Installer,Registry,我的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

我的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>

ISCC217existx64
ISCC2018 Existx64
所以明年,Photoshop将发布Photoshop CC 2019,我不想专门为这个版本创建安装程序。我想搜索注册表:
Software\Adobe\Photoshop
并循环浏览每个可能的版本(如上面的110.0和120.0)

所以我的问题是:

1) 是否有方法使用
循环所有子注册表项

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

如果Wix语言无法实现,有没有一种方法可以使用自定义操作来实现?(如果有人能指点我如何做这样的事情,我从来没有做过任何定制的动作,这是非常感激的)。

总体而言:很难为“未来”创建设置。事情总有一种变化的方式,所以你支持当前未知事物的美好计划被浪费了(它们开始使用完全不同的键,或者在整个应用中使用
UWP
)。您最好放弃这个愿望列表支持,到时候只需编译一个新的设置。我的两分钱


循环:我不知道有任何内置的MSI构造可以循环注册表项。我相信你必须采取一种习惯性的行动来实现这一点

自定义操作:自定义操作可以是
EXE文件
(本机,托管),
C++dll
(本机),
C#/VB dll
(托管),
ActiveScripting
JavaScript
),有些甚至使用
Powershell
(我不会)。你选择什么语言?C++ DLL是最可靠的(运行时要求,可调试性等),如果你能处理C++复杂度首先。经验法则:尽可能地进行静态链接。有时,定制操作是唯一的选择(针对不必要的CA)。WIX在C++中有一些C++和托管代码自定义操作模板(<>强>尝试这些< /强>安装扩展,并通过VisualStudio中的新项目对话框调用)。也许也是

已经有一段时间没有阅读这些内容了,但希望确保您拥有它们:

  • Chris Painter:你能粗略检查一下吗?过时的文章?你知道我对托管代码不在行
  • (没有经过我的测试,看起来很简单)
<> >强> C++调试>强:使用C++,您可以在调试的自定义操作函数中显示消息框,然后将调试器附加到弹出的消息框中。基本上只是附加到
msiexec.exe
——根据自定义操作的顺序,可以是用户上下文,也可以是系统上下文。即时、完全可调试

托管CA调试:对于托管代码,还将显示来自自定义操作的消息框,然后附加到运行托管代码的
rundll32.exe
进程。下面是一段很好的视频,向您展示了如何做到这一点:

文件复制:这不是我最喜欢的概念,但您可以尝试MSI的
CopyFile
功能,如下所述:请务必检查实际的WiX源以了解其总体概念。下面是另一个类似的答案:。值得一试。不是火箭科学,但我觉得很微妙。但是Chris的完整示例代码应该可以帮助您

功能级别0:在将功能级别设置为
0
时,我发现了一个意外问题。此处对其进行了描述:基本上:显示设置为级别
0
的功能
在一个过程中不被提取。当我看到它时,我发现这很难相信,我现在仍然相信,但测试表明确实如此这可能会导致应用程序在公司环境中使用时出现问题(它们在很大程度上取决于)。解决方案我采用另一种方法:默认情况下将功能安装级别设置为1,如果功能条件为真,则将其更改为0。咯咯,我知道。

谢谢你的链接,我会浏览一下,看看能找到什么。我知道这可能是一个很难处理的未来软件。但通过研究,我发现当前的Photoshop(2013年至2018年)正在使用共享文件夹作为插件。所以我可以在那个文件夹中安装,并希望他们在2019+年仍然使用该功能。因此,我的安装程序应该只处理该特定文件夹中的安装。但我仍然有兴趣安装到特定的文件夹,以有不同的配置文件。再次感谢,我将测试这些,如果有效,我将接受这个anwser。我感到很遗憾的是MSI for循环在WiX中无法正常工作,但我将进一步检查。我只是不想在这上面投入太多的时间,因为我可以一个接一个地添加未来的软件,就像我已经为几个版本做的那样。看起来你想依靠未来的形状。你可以像过去一样把它硬装起来。再多写几篇文章就能让你领先几年。如果您不喜欢编写重复的代码,您可以生成它。(另一方面,每个新版本都是与用户联系的机会。)