问题 如何修复WiX警告:组件“X”包含HKCU注册表KeyPath的每用户和每台机器数据


我正在尝试维护一些Wix代码,并收到以下警告:

warning LGHT1076 : ICE57: Component 'FILE_MY_ASSOCIATION' has both per-user and per-machine data with an HKCU Registry KeyPath.

从以下代码:

<Component Id="FILE_MY_ASSOCIATION" Guid="E1DF42A5-BD00-4a80-9BE5-B66A3EF0576E" Win64="$(var.Variables_Win64)">
  <RegistryKey Root="HKCU" Key="Software\MyComany\MyProduct">
    <RegistryValue Value="" Type="string" KeyPath="yes" />
  </RegistryKey>
  <ProgId Icon="FILE_MY_FILETYPE_ICON" Id="MY_FILE_EXTENSION" Description="My Product File" >
    <Extension Id="myext" Advertise="no" >
      <Verb Id="Open" Argument="&quot;%1&quot;" TargetFile="MYUI_EXE_FILE"/>
    </Extension>
  </ProgId>
</Component>

我在解决什么问题时遇到了麻烦,或者这是一个警告,我真的需要担心。

  • 我是否需要担心并修复此警告?在某些情况下,代码是否会导致问题?
  • 另外,我想知道,为什么注册表项使用HKCU而不是HKLM。如果我把它改成HKLM。警告消失了,但这会影响安装程序的行为吗?

谢谢。


7160
2017-10-25 16:08


起源



答案:


警告表示您正在同一组件中编写用户特定数据和系统范围数据。您的注册表项正在写入 HKCU 它将始终写入注册表的用户特定部分。 ProgId另一方面,将注册表项写入 HKCR 哪个可以写入 HKLM 要么 HKCU。如果它写入 HKLM 这是一个系统范围的注册表空间,您的单个组件正在写入用户特定的注册表配置单元和系统注册表配置单元,这违反了 ICE警告 你得到了。


10
2017-10-26 03:05



Interestring。所以ProgId可以转到每个用户或每个机器的配置单元。我想知道,RegistryKey条目的存在是否可以强迫ProgId去HKCU而不是HKLM? - Scott Langham
不, KHCR link解释了何时进入HKCU与HKLM的规则。 - heavyd


答案:


警告表示您正在同一组件中编写用户特定数据和系统范围数据。您的注册表项正在写入 HKCU 它将始终写入注册表的用户特定部分。 ProgId另一方面,将注册表项写入 HKCR 哪个可以写入 HKLM 要么 HKCU。如果它写入 HKLM 这是一个系统范围的注册表空间,您的单个组件正在写入用户特定的注册表配置单元和系统注册表配置单元,这违反了 ICE警告 你得到了。


10
2017-10-26 03:05



Interestring。所以ProgId可以转到每个用户或每个机器的配置单元。我想知道,RegistryKey条目的存在是否可以强迫ProgId去HKCU而不是HKLM? - Scott Langham
不, KHCR link解释了何时进入HKCU与HKLM的规则。 - heavyd


听起来好像编译器会提醒您可能不是您想要的行为:如果您仅为用户注册文件关联,则其他用户将看不到该关联。这对于应用程序来说是一种不寻常的行为。因此,这取决于您的要求:您是否希望注册的应用程序为所有用户处理该类型的所有文档,或仅处理安装用户?


1
2017-10-25 16:14



嗯。我可能希望注册的应用程序为所有用户处理该类型的所有文档。你能告诉我它现在会写什么吗? - Scott Langham
也许你说片段,因为它只会为安装用户注册文件关联。 - Scott Langham