我最近将一个旧的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.
我希望这会有所帮助。
答案 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安装程序中发现一个奇怪的错误,你无法弄清楚代码似乎与在线发现的数千个资源一致,考虑你可能在拍摄自己您的一个自定义操作。