我为大型程序创建了一个WiX安装包。安装包中包含Visual C ++ 9.0文件的合并模块。我需要包含COM DLL的合并模块。安装运行得很好。但是,第一次运行程序时,会发生奇怪的事情。第一次调用COM DLL时,Windows安装机制开始运行。一个安装对话框突然出现。它做了它需要做的一段时间,然后它消失了,程序恢复其正常功能。这只发生在第一次第一次需要Visual C ++合并模块的COM DLL时,一旦安装程序完成,程序就会继续运行而不会发生意外。为什么会发生这种情况,我该怎么做才能阻止它呢?以下是合并模块的WiX代码:
<DirectoryRef Id="TARGETDIR">
<Merge Id="VCRedistCRT" SourceFile="C:\Program Files\Common Files\Merge Modules\Microsoft_VC90_CRT_x86.msm" DiskId="1" Language="0"/>
<Merge Id="VCRedistATL" SourceFile="C:\Program Files\Common Files\Merge Modules\Microsoft_VC90_ATL_x86.msm" DiskId="1" Language="0"/>
<Merge Id="VCRedistMFC" SourceFile="C:\Program Files\Common Files\Merge Modules\Microsoft_VC90_MFC_x86.msm" DiskId="1" Language="0"/>
<Merge Id="VCRedistMFCLOC" SourceFile="C:\Program Files\Common Files\Merge Modules\Microsoft_VC90_MFCLOC_x86.msm" DiskId="1" Language="0"/>
<Merge Id="VCRedistOpenMP" SourceFile="C:\Program Files\Common Files\Merge Modules\Microsoft_VC90_OpenMP_x86.msm" DiskId="1" Language="0"/>
</DirectoryRef>
<Feature Id="VCRedistCRT" Title="Visual C++ 9.0 CRT Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedistCRT"/>
</Feature>
<Feature Id="VCRedistATL" Title="Visual C++ 9.0 ATL Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedistATL"/>
</Feature>
<Feature Id="VCRedistMFC" Title="Visual C++ 9.0 MFC Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedistMFC"/>
</Feature>
<Feature Id="VCRedistMFCLOC" Title="Visual C++ 9.0 MFC LOC Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedistMFCLOC"/>
</Feature>
<Feature Id="VCRedistOpenMP" Title="Visual C++ 9.0 Open MP Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedistOpenMP"/>
</Feature>
如果我不得不猜测,看起来“首次使用时”安装了Visual C ++库;也就是说,在有人使用它之前,该功能尚未完全安装。我认为这是不可能的,因为AllowAdvertise值设置为“no”,但我不是WiX专家。
答案 0 :(得分:2)
听起来好像你有一些COM注册广告。我强烈建议不要刊登广告:http://robmensching.com/blog/archive/2007/03/12/RobMens-Recommendation-Do-not-advertise-COM-information-in-MSI.aspx。
首先,检查您的源代码是否包含Advertise =“yes”。如果这不明显,则计算机上的事件日志将具有Windows Installer事件,该事件将指向需要修复/按需安装的组件。这应该会大大缩小搜索范围。
答案 1 :(得分:0)
您还必须安装策略合并模块:
C:\Program Files\Common Files\Merge Modules\policy_9_0_Microsoft_VC90_ATL_x86.msm
C:\Program Files\Common Files\Merge Modules\policy_9_0_Microsoft_VC90_CRT_x86.msm
C:\Program Files\Common Files\Merge Modules\policy_9_0_Microsoft_VC90_MFC_x86.msm
C:\Program Files\Common Files\Merge Modules\policy_9_0_Microsoft_VC90_MFCLOC_x86.msm
不确定这是否会解决问题,但是否则肯定会遗漏。
答案 2 :(得分:0)
感谢您的回复。检查事件查看器的提示是神奇的部分。显然,有一个以空格开头的安装文件的条目。无论出于何种原因,WiX编译器允许这样做,并且安装程序安装了它,但是当COM组件第一次启动时,系统或安装程序中的某些内容确定这不是犹太教,并引发了错误。此特定文件与COM注册完全无关。当我删除文件名称开头的空格时,问题就消失了。 我将采取Mensching先生的建议并从文件中删除广告。我正在使用其中一个WiX工具生成的代码(我不记得哪个),并且出于某种原因,它选择在COM组件上标记advertise =“yes”。我绝对不希望安装程序尝试在这些COM组件上进行某种运行时安装。