我工作的应用程序主要是用VB6编写的。
有些用户报告说,当他们启动我的应用时,不同的MSI安装程序会自动运行并尝试修复自己的安装。通常这适用于AutoCAD,但有时也适用于其他程序。
通常每次启动应用时都会出现这种情况。
我们可以使用什么程序来诊断出现这种情况的原因?由于它是第三方的安装程序正在运行,因此我们无法查看它正在做。
AutoDesk确实发布了一些信息:
但这些并不能直接提供足够的信息。 理想情况下,我希望能够完全阻止我的最终用户,而不是仅告诉他们如何避免或清理它。
答案 0 :(得分:2)
您的安装程序正在执行Windows Installer所知道的目录,文件或注册表项,这是AutoCad安装的一部分。
首先,我打开全局Windows Installer日志记录。这意味着任何Windows Installer活动(包括AutoCad的安装程序)都会写入外部日志文件(%temp%) 。
接下来,运行安装程序,然后运行AutoCad安装程序。
现在转到%temp%,您应该找到文件MSIXXXX.LOG - 一个用于安装程序,一个用于AutoCad。打开这些,您可以通过它们工作,并确定AutoCad MSI找到的文件或注册表项丢失或更改。
您可能会发现WiLogUtl.exe对此有帮助:
如果幸运的话,您将确定触发自动修复的目录,文件或注册表项也在您的安装程序中。如果您真的很幸运,您可以将其识别为您不应该安装的项目 - 也许您正在引用一个无论如何都存在的系统组件,受Windows文件保护保护。
如果没有,您将不得不查看类似RegFree COM的内容,将文件从共享目录中移出到您的私人目录中,并减少注册表冲突。此外,如果您正在使用(使用)Visual C ++运行时MSM来创建MSI,请考虑使用Microsoft EXE安装程序,或者(最重要的是)将DLL直接放在程序文件夹中,因为我发现了MSM可能会导致这类问题。
答案 1 :(得分:1)
关于Peter Cooper Jr对VB6导致自我修复的评论。请查看Wix的 heat.exe 文档。您将看到该工具支持一个特殊的开关来禁止提取VB6运行时本身拥有的某些注册表值(因此不应该被任何其他MSI搞砸或更新): {{ 3}} 强>
从列表中下载 the switch -svb6 ,然后阅读右侧的说明。 (转载于此处:)
注册在VB6中创建的COM组件时,它会添加注册表 属于VB6运行时组件的条目:
- CLSID {D5DE8D20-5BB8-11D1-A1E3-00A0C90F2731}
- 类型库{EA544A21-C82D-11D1-A3E4-00A0C90AEA82}
- 类型库{000204EF-0000-0000-C000-000000000046}
[以及]引用这两个类型库的任何接口
您的安装程序是否写入这些密钥?如果是这样,试着排除它们 - 即使在这种特殊情况下它不是罪魁祸首,这也是好事。
除此之外,还有一个很长的描述可以导致Windows Installer自我修复: http://wixtoolset.org/documentation/manual/v3/overview/heat.html 。这是一篇很长的文章,因为有很多不同的方式可以进行自我修复。另一个共同点是,系统上的不同安装程序正在争夺共享设置,以便在无限循环中每次启动应用程序时使用自己的值进行更新。