为什么MsiGetFeatureState()为我的不可分辨的功能返回INSTALLSTATE_ADVERTISED?

时间:2017-07-25 23:01:47

标签: wix windows-installer

我已经在WiX中构建了一个MSI,定义如下:

<Feature Id="Core"
         Display="0"
         Absent="disallow"
         ConfigurableDirectory="INSTALLDIR"
         AllowAdvertise="no"
         Level="1">...</Feature>

我有一个&#39;承诺&#39;自定义操作,循环遍历MSI的所有功能并确定其安装状态。日志文件显示了这个&#34; Core&#34;功能已安装&#39;本地&#39;,但MsiGetFeatureState返回INSTALLSTATE_ADVERTISED。我认为这是不可能的,因为我设置:

AllowAdvertise="no"

FWIW,MsiGetFeatureState为所有其他已安装的功能正确返回INSTALLSTATE_LOCAL,为所有其他未安装的功能正确返回INSTALLSTATE_ABSENT。

修改以获取更多信息:

  • 在全新安装期间发生这种情况。
  • 我没有设置ADVERTISE属性(我仍然不完全理解它的用途)
  • &#34;核心&#34;功能一个父功能,其子项都具有wix属性InstallDefault =&#34; followParent&#34;。
  • &#34;核心&#34;功能(及其子功能)都附加了组件。
  • 所有子功能也标记为INSTALLSTATE_ADVERTISED。
  • 我有一个提交自定义操作(在InstallFinalize之前安排),用于查询已安装的功能状态([ProductCode]通过CustomActionData传入)。我认为提交操作是正确的选择,因为此时MSI正式安装。

2 个答案:

答案 0 :(得分:1)

AllowAdvertise="no"msidbFeatureAttributesDisallowAdvertise表中变为Feature,表示:

  

请注意,此位仅适用于ADVERTISE属性列出的功能。

IOW,如果因其他原因而被广告宣传,这一点就不会停止。

答案 1 :(得分:0)

发现问题是什么(我认为)。

如果某些条件为真,我有一个自定义操作会调用MsiSetComponentState()将组件设置为INSTALLSTATE_ABSENT。这意味着我的“核心”功能旨在将每个连接的组件设置为INSTALLSTATE_LOCAL,但由于这一个组件被手动强制进入INSTALLSTATE_ABSENT,因此“核心”功能(一旦安装)被认为具有“广告”的安装状态。另一个后果是,在卸载过程中,连接到“核心”功能的所有组件都被遗忘了。他们的行动状态是NULL(什么也不做)而不是Absent(删除)。

故事的道德,不要使用MsiSetComponentState()在安装时关闭组件。