【问题标题】:Diagnosing self-healing MSI诊断自愈 MSI
【发布时间】:2016-12-31 12:44:56
【问题描述】:

我开发的应用程序主要是用 VB6 编写的。

一些用户报告说,当他们启动我的应用程序时,一个不同的 MSI 安装程序会自动运行并尝试修复它自己的安装。这通常适用于 AutoCAD,但有时也适用于其他程序。

这通常会在他们每次启动应用程序时发生。

我们可以使用什么程序来诊断为什么会发生这种情况?由于它是第三方安装程序正在运行,我们无法了解它在做什么。 p>

AutoDesk 确实在此发布了一些信息:

但这些并不能直接提供足够的信息。 理想情况下,我希望能够完全防止这种情况发生在我的最终用户身上,而不是仅仅告诉他们如何避免或清理它。

【问题讨论】:

  • 第一个链接描述了您应该查找的事件日志条目类型。它会告诉您 Windows Installer 检测到需要修复的组件。由您决定为什么该组件需要维修,或者更好地描述它以便我们提供帮助。另见stackoverflow.com/questions/5501028/…
  • 出现的安装程序,是来自您的应用程序还是来自 Autodesk/AutoCAD?
  • 运行的是 AutoCAD 安装程序,而不是我们自己的。问题已得到澄清 - 谢谢。
  • 我记得很久以前发生过这种事情(当时我正在处理 VB6 项目),尽管在我们的例子中是 Microsoft Office 安装程序。不知何故,项目和 Office 都使用了一些公共库,Windows Installer 必须确保每次都“正确”。不过,我不记得曾经深入了解它。

标签: vb6 windows-installer installation autocad


【解决方案1】:

关于 Peter Cooper Jr 关于 VB6 导致自修复的评论。请查看 Wix 的 heat.exe 文档。您将看到该工具支持一个特殊的开关来禁止提取 VB6 运行时本身拥有的某些注册表值(因此不应被任何其他 MSI 弄乱或更新):http://wixtoolset.org/documentation/manual/v3/overview/heat.html

在列表中找到开关 -svb6 并阅读右侧的说明。 (转载于此:)

注册在 VB6 中创建的 COM 组件时,它会添加注册表 属于 VB6 运行时组件的条目:

  • CLSID{D5DE8D20-5BB8-11D1-A1E3-00A0C90F2731}
  • 类型库{EA544A21-C82D-11D1-A3E4-00A0C90AEA82}
  • 类型库{000204EF-0000-0000-C000-000000000046}

[以及]引用这两个类型库的任何接口

您的安装程序是否会写入这些密钥?如果是这样,请尝试排除它们 - 即使在这种特殊情况下它不是罪魁祸首,也可以这样做。

除此之外,这里还有一个很长的说明,说明了可能导致 Windows Installer 自我修复的原因:How can I determine what causes repeated Windows Installer self-repair?。这是一篇很长的文章,因为可以通过多种不同的方式进行自我修复。共同点是,您系统上的不同安装程序正在争夺一个共享设置,他们会在每次应用程序启动时不断更新自己的值,以无限循环。

【讨论】:

  • 看起来我们的安装程序没有编写这些密钥;但这是一件非常有用的事情。我已经从您引用的链接中添加了关键位,以防它将来消失。
【解决方案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 可以导致这种问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2023-03-19
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多