我已经在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。
修改以获取更多信息:
答案 0 :(得分:1)
AllowAdvertise="no"
在msidbFeatureAttributesDisallowAdvertise
表中变为Feature
,表示:
请注意,此位仅适用于ADVERTISE属性列出的功能。
IOW,如果因其他原因而被广告宣传,这一点就不会停止。
答案 1 :(得分:0)
发现问题是什么(我认为)。
如果某些条件为真,我有一个自定义操作会调用MsiSetComponentState()将组件设置为INSTALLSTATE_ABSENT。这意味着我的“核心”功能旨在将每个连接的组件设置为INSTALLSTATE_LOCAL,但由于这一个组件被手动强制进入INSTALLSTATE_ABSENT,因此“核心”功能(一旦安装)被认为具有“广告”的安装状态。另一个后果是,在卸载过程中,连接到“核心”功能的所有组件都被遗忘了。他们的行动状态是NULL(什么也不做)而不是Absent(删除)。
故事的道德,不要使用MsiSetComponentState()在安装时关闭组件。