【问题标题】:Class table generated InprocServer32 value problem类表生成InprocServer32值问题
【发布时间】:2010-08-31 22:21:37
【问题描述】:

我正在安装一个包含一些 COM 服务器的 Active X 控件。我正在使用 InstallShield 的 COM Extract at Build 选项来生成注册表信息。这会导致注册表和类表中有很多条目。 (使用 Wix 提取的信息几乎相同)。

看来我的 COM Sever 已正确安装,但 InprocServer32 键中名为“InprocServer32”的附加值如下所示:

HKCR\CLSID\{MY-COM-GUID}\InprocServer32
    (Default) = C:\Path-to-my\file.ocx
    InprocServer32 = 8tYCAGak)9S9&~swl.$?MyFeatureName>*&N$B'fk?As1x2J653?'

我唯一能从额外值中得出的结论是 MyFeatureName,它是包含 .ocx 文件的 MSI 功能的内部名称。该键未列在 Registry 表中,因此必须由 Class 表生成。

我遇到的问题只发生在 Windows Server 2008 中。似乎尝试使用 COM 服务器的应用程序无法从(默认)值中找到 .ocx 文件的路径,而是找到了InprocServer32 值。这会导致应用启动 MSI,然后让 MSI 陷入看似无限循环的状态。

我想知道这是否是 Windows Server 2008 中的一个已知问题,或者是否有办法阻止 msiexec 生成该额外值。

【问题讨论】:

    标签: com installation wix windows-installer installshield


    【解决方案1】:

    我会阅读这篇文章,看看它是否能帮助你到达你想去的地方:

    RobMen's Recommendation: Do not advertise COM information in MSI

    您可能希望在构建时关闭 InstallShield 的 COM 提取,而是对相关组件执行一次性 COM 提取。然后您可以进入“组件高级”部分并手动操作注册表/ com 表信息,使其成为您想要的样子。

    如果您完全使用 WiX,另一个工作流程/技巧是使用 Heat 围绕您的 COM 服务器构建 MSI 或 MSM。然后使用 InstallShield 在直接模式下编辑 MSI/MSM,并使用注册表视图将注册表项/值导出到 .REG 文件。然后将该 .REG 文件导入到实际安装项目中的组件中。

    【讨论】:

      【解决方案2】:

      我无法帮助您诊断正在发生的事情,我只会咕哝一下这一切意味着什么。这是针对 DLL Hell 的对策。它应该保护您的应用程序免受可能覆盖您的 COM 服务器注册表项的某种其他安装程序的影响。特别是(默认)键,它为您的服务器 DLL 提供位置。

      从伪造的 InprocServer32 值,应用程序可以自动检测到 Default 密钥已被覆盖,并自动再次启动 MSI 以修复损坏。这就是你看到的情况。

      我完全不喜欢这个功能,它只是一个故障点,当它爆炸时已经很难排除故障。这是一个无用的功能,它假定其他安装程序不使用完全相同的对策。这在 10 年前就可行了。

      不知道你会做什么来解决这个特定的故障。其他然后只是踢这个 cr*p 并让服务器只是 SelfReg 自己。至少当那个不起作用时,你会有一些东西可以使用。

      【讨论】:

      • SelfReg 实际上是您在安装中可以做的最糟糕的事情。它有各种令人讨厌的副作用,包括你最初可能没有想到的副作用。 ;) 正如克里斯指出的那样,我的建议是避免使用 COM 广告。
      • @Rob - 来自 regfree COM 的缩写,选项 #3 是什么?
      • 汉斯,将注册信息放入您的 MSI 注册表中。 WiX 工具集有一些很好的元素可以帮助您在没有太多代码的情况下完成此操作(Class、TypeLib、ProgId 等元素)。
      • @Rob - 这有什么意义吗?只要您必须自己咳出注册详细信息,还不如使用regfree COM。不再需要安装程序。
      • 如果COM对象只被你的应用程序使用,regfree COM是完全合理的。如果您需要向其他人公开您的 COM 对象,则需要注册。另外,我不明白为什么您不需要安装程序。一旦你有多个文件,你可能应该有一个事务来安装它们......通常一个应用程序需要一个快捷方式或其他地方的东西.​​.....等等。我很少看到一个应用程序没有不需要安装包。 SysInternals 的东西是少数(因为它们提供单文件可执行文件)。
      猜你喜欢
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多