【问题标题】:Wix RegistryValue that references installer property always empty引用安装程序属性的 Wix RegistryValue 始终为空
【发布时间】:2018-08-22 00:15:54
【问题描述】:

我正在尝试将 MediaSourceDir 写入应用程序安装的注册表中,并且它始终插入一个空值。我在安装时成功地将 SourceDir 写入注册表,我的 .wxs 文件中有以下内容:

<RegistryValue Type="string" Name="MediaSourceDir" Value="[MediaSourceDir]" />
<RegistryValue Type="string" Name="SourceDir" Value="[SourceDir]" />

我使用详细日志运行安装程序,以下是一些有趣的部分:

MSI (c) (70:48) [16:30:17:332]: PROPERTY CHANGE: Adding SourceDir property. Its value is 'D:\'.
MSI (c) (70:48) [16:30:17:332]: PROPERTY CHANGE: Adding SOURCEDIR property. Its value is 'D:\'.
MSI (c) (70:48) [16:30:17:332]: PROPERTY CHANGE: Adding MediaSourceDir property. Its value is '1'.

所以看起来它正在正确获取必要的安装程序属性。但是稍后在日志文件中,当它向注册表添加值时,它会报告以下内容:

MSI (s) (C4:F0) [16:30:31:525]: Executing op: RegAddValue(Name=MediaSourceDir,,)
MSI (s) (C4:F0) [16:30:31:530]: Executing op: RegAddValue(Name=SourceDir,Value=D:\,)

如您所见,MediaSourceDir 键的值为空。我很困惑为什么当我为 SourceDir 做类似的事情并且它无缝工作时这不起作用。任何见解将不胜感激。

【问题讨论】:

    标签: windows wix installation


    【解决方案1】:

    虽然您很清楚,但我应该指出(对其他人)MediaSourceDir 只会在您从可移动媒体(CD/DVD/USB 等)安装时设置。就这么清楚了。否则,它是空白/未设置,并且尝试持久化它会产生一个空字符串。

    但是,我也看到 MediaSourceDir 无法像 SourceDir 那样持续存在的问题。我通过使用 SetProperty 自定义操作将 MediaSourceDir 的值分配给公共属性来使其工作,但在静默运行设置时它不起作用。

    <Property Id='MYPROPERTY' Secure='yes' />
    <SetProperty Id="MYPROPERTY" After="FindRelatedProducts" Value="[MediaSourceDir]" Sequence="first" />
    
    <..>
    
    <Component Feature="ProductFeature">
       <RegistryValue Root='HKLM' Key='SOFTWARE\Wix\DemoRememberProperty'
                      Name='MediaSourceDirMYPROPERTY' Value='[MYPROPERTY]'
                      Type='string' />
    <..>
    
    </Component>
    

    我们需要知道持久化的目的是什么?您能否改用 MSI API 来确定安装源驱动器是否为可移动驱动器?

    稍后会再看看这个。 WiX's Remember Property Pattern.

    我删除了关于 Private 和 PUBLIC 属性的整个片段,以及它们在延迟模式下的处理方式不同,不确定这是否已经是你研究过的东西,但似乎没有太大必要。

    【讨论】:

    • 当您说安装程序静默运行时它不起作用时,您的意思是调用“msiexec /quiet /i ....”会导致该字段无法正确填充吗?我正在编写一个使用 Wix 来创建安装程序的电子应用程序。该应用程序可以通过从 Internet 下载或接收刻有软件的光盘来安装。这两个安装程序必须完全相同,我们希望跟踪通过光盘安装它的人与下载它的人。由于它是一个电子应用程序,我不相信 MSI API 是一种选择,但我不确定。
    • 恐怕我对 Electron 不熟悉。是的,我安装了与msiexec.exe /quiet 匹配的msiexec.exe /QN。为每个安装的软件包存储安装源路径。我有 VBScripts 可以确定驱动器号实际上是什么类型的驱动器。如果我猜 DVD 驱动器的驱动器号发生变化,它可能会变得混乱。我使用FileSystemObject.GetDrive 方法,然后使用Drive.DriveType。我可以为此添加一些 VBScript 代码,但这可能不是您需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多