WiX 3:错误1406:无法将值{ValueName}写入密钥{KeyName}

时间:2015-05-21 16:37:02

标签: wix

我最近将一个旧的WiX 2项目转换为WiX 3.在之前的WiX项目中,有一个组件包含许多快捷方式,如下所示。

<Component Id="ShortcutsComponent" Guid="$(var.ShortcutsComponentGuid)">
    <Shortcut Id="Shortcut1" Name="Shortcut1Name" LongName="Shortcut1LongName"
        Directory="ShortcutsDir" Target="{Target}" />
    <Shortcut Id="Shortcut2" Name="Shortcut2Name" LongName="Shortcut2LongName"
        Directory="ShortcutsDir" Target="{Target}" />
</Component>

当我将项目转换为WiX 3时,会导致以下错误。

错误LGHT0204:ICE43:组件ShortcutsComponent具有未公布的快捷方式。它的KeyPath注册表项应属于HKCU。

要解决我所犯的错误,请通过添加RegistryValue元素修改ShortcutsComponent,如下所示。

来自我们的Variables.wxi文件。

<?define JAWSVersion = "$(env.Major).0"?>
<?define FSRegistryKey = "SOFTWARE\Freedom Scientific"?>
<?define JAWSRegistryKey = "$(var.FSRegistryKey)\JAWS"?>

在包含Variables.wxi的WXS文件中,我将以下行添加到ShortcutsComponent。

<RegistryValue
    Root="HKCU" Key="$(var.JAWSRegistryKey)\$(var.JAWSVersion)\Components"
    Name="ShortcutsComponent" Action="write" Type="integer" Value="1"
    KeyPath="yes" />

我对许多组件进行了类似的更改。

现在我在安装软件时遇到错误,但仅限于某些计算机上。错误如下。

Error 1406: Could not write value {ValueName} to key {KeyName}.
System error. Verify that you have sufficient access to that key,
or contact your support personnel.

我考虑用以下内容替换上面的RegistryValue行,但我不希望结果有任何不同。

<RegistryKey Root="HKCU" Key="$(var.FSRegistryKey)" Action="create">
    <RegistryKey Key="JAWS" Action="create">
        <RegistryKey Key="$(var.JAWSVersion)" Action="create">
            <RegistryKey Key="Components" Action="create">
                <RegistryValue
                    Name="ShortcutsComponent" Action="write"
                    Type="integer" Value="1" KeyPath="yes" />
            </RegistryKey>
        </RegistryKey>
    </RegistryKey>
</RegistryKey>

有没有人对如何解决这个问题有任何建议?

注意:我被要求提供{ValueName}和{KeyName}的精确值。以下是日志文件中的相关行。

MSI (s) (1C:8C) [14:36:29:183]: Executing op: RegOpenKey(Root=-2147483647,Key=SOFTWARE\Freedom Scientific\JAWS\17.0\Components,,BinaryType=1,,)
MSI (s) (1C:8C) [14:36:29:183]: Executing op: RegAddValue(Name=RemoveExploreDir,Value=#1,)
WriteRegistryValues: Key: \SOFTWARE\Freedom Scientific\JAWS\17.0\Components, Name: RemoveExploreDir, Value: #1
MSI (s) (1C:8C) [14:36:29:183]: Note: 1: 1401 2: HKEY_CURRENT_USER\SOFTWARE\Freedom Scientific\JAWS\17.0\Components 3: 1021 
Error 1406. Could not write value RemoveExploreDir to key \SOFTWARE\Freedom Scientific\JAWS\17.0\Components.  System error .  Verify that you have sufficient access to that key, or contact your support personnel.
MSI (s) (1C:8C) [14:40:09:789]: Product: Freedom Scientific JAWS 17.0 -- Error 1406. Could not write value RemoveExploreDir to key \SOFTWARE\Freedom Scientific\JAWS\17.0\Components.  System error .  Verify that you have sufficient access to that key, or contact your support personnel.

我希望这会有所帮助。

1 个答案:

答案 0 :(得分:0)

这更像是一个发现报告,而不是一个答案。事实证明,问题不在于WiX代码,而在于安装程序使用的DLL中包含的自定义操作。此自定义操作使用REG_OPTION_VOLATILE选项创建了注册表项“HKEY_CURRENT_USER \ Software \ Freedom Scientific \ RJSetup”。这意味着如果“HKEY_CURRENT_USER \ Software \ Freedom Scientific”尚不存在,它也是使用REG_OPTION_VOLATILE选项创建的。当WiX安装程序尝试写入“HKEY_CURRENT_USER \ Software \ Freedom Scientific”下的任何键时,这会导致错误1406.我们正在修复自定义操作,以便它首先创建“HKEY_CURRENT_USER \ Software \ Freedom Scientific”注册表项作为标准键,然后使用REG_OPTION_VOLATILE选项创建“HKEY_CURRENT_USER \ Software \ Freedom Scientific \ RJSetup”注册表项。这有望解决问题。

故事的寓意是,如果你在WiX安装程序中发现一个奇怪的错误,你无法弄清楚代码似乎与在线发现的数千个资源一致,考虑你可能在拍摄自己您的一个自定义操作。