【问题标题】:How does one 'Extract Com Information' from an OCX without InstallShield?如何在没有 InstallShield 的情况下从 OCX 中“提取 Com 信息”?
【发布时间】:2012-03-27 03:20:58
【问题描述】:

在我们的团队正在进行的一个项目中,我们正在尝试为现有的桌面应用程序创建一个自动部署系统。为此,我们首先需要了解 InstallShield 如何安装应用程序。

我们可以访问 InstallShield 清单,但是有一个 OCX 文件,我们无法弄清楚如何手动安装(没有 InstallShield)。这个特定的 OCX 文件设置为“Extract COM Information”。

截图如下:

此应用程序中的其他 OCX 是自注册的,因此可以使用 Regsvr32.exe 注册。但是我们遇到问题的 OCX 无法以这种方式注册。

如何手动安装在 InstallShield 清单中设置为“提取 COM 信息”的 OCX 文件?

【问题讨论】:

    标签: deployment com installation installshield ocx


    【解决方案1】:

    RegSvr32.exe 调用LoadLibrary API 来加载您的DLL,然后调用您的DLL 中的DllRegisterServer 入口点。该函数内的代码执行实际的 COM 注册。如果 RegSvr32 失败,这通常意味着您的 DLL 依赖项丢失或无效。

    InstallShield 完成了所有这些工作,并通过一些非常低级的位黑客来虚拟化所有这些,然后收获它。关于这个主题的一篇旧文章是:

    Spying on Registry Entries

    InstallShield 实际上并没有使用这种技术(他们有几种技术,其中大部分没有记录,还有各种过滤器和转换引擎来清理数据)。如果您只是在寻找一种不使用 InstallShield 的方法,请查看 Windows Installer XML 的“Heat”命令行工具。这可以将 COM 元数据“收集”到 WxS XML 元素中。

    WiX 也是开源的,所以如果你真的很好奇,可以去看看他们的代码。

    【讨论】:

    • 很抱歉我们不能修改dll,所以我们必须另想办法。
    • 我不相信我说过任何关于修改任何 DLL 的内容。
    • +1 感谢您的回复,让我澄清一下。我不确定“RegSvr32.exe 调用 LoadLibrary 以加载您的 DLL,然后在您的 DLL 中加载 DllRegisterServer()”。方法。你是说在部署系统中运行 DllRegisterServer 吗? (我们可以以编程方式做事)。重申一下,是说在任何部署应用程序的内部,都必须调用 DllReigsterServer()?
    • 我清理了我的措辞并添加了一些链接,也许这会为你澄清。
    【解决方案2】:

    正如 Christopher 所提到的,InstallShield 通过查看它在调用时注册的内容从您的 .ocx 中提取 COM 信息,类似于 regsvr32.exe 将调用它。它的各种形式的重定向(用于捕获目的)具有解决几个潜在权限问题的额外好处,而文件正在您的构建环境中注册。但是,如果我没有错过您问题的重点,那就是“为什么 regsvr32.exe your.ocx 不能在目标机器上工作?”

    这有点像在黑暗中刺伤,因为您没有提供足够的信息。虽然缺少依赖项可能会导致此问题,但我猜您只会在 Windows Vista/Server 2008 或更高版本上看到此故障。如果是这种情况,您的应用程序很有可能正在尝试写入受 Windows Resource Protection (WRP) 保护的注册表项,或者被每个用户的类型库注册问题绊倒。

    当行为不佳的自注册例程遇到 WRP 时,它会尝试写入它没有修改权限的注册表项,然后整个注册失败。我不确定它在那之前写的键会发生什么,但它之后的所有键肯定永远不会进入机器。您应该可以使用Process Monitor 之类的工具来确认是否属于这种情况。

    如果是这种情况,你会怎么做?好吧,您可以坚持使用 InstallShield 之类的提取方法(您说要离开)。您可以修复文件以不尝试写入受保护的密钥(您说您无法修改)。或者你可以使用Application Compatibility Toolkit (ACT) 来填充东西,但我不知道你通常如何在下游做到这一点。一般来说,我会建议修复文件,或继续使用有效的方法。

    【讨论】:

    • +1 感谢 cmets 的周到,您认为我应该在问题中包含哪些其他信息?
    • Michael 拥有实际在 InstallShield 工作的不公平优势,因此他对代码了如指掌。 :-) FWIW,我对你的问题不清楚的是,如果你想在非常低的层次上了解提取是如何工作的,以便你可以编写自己的程序,或者你只是想为此解决 COM 提取问题一次,或者如果您只是不想依赖 InstallShield 继续完成工作。
    • 如果您只是想解决这个 DLL 的 COM 提取问题,并且您不介意通过电子邮件将其发送给我,我可以通过一些我必须尝试的技巧来运行它为你试一试。
    • 我们只是试图解决 COM 提取问题,以便我们可以在我们自己的 clickonce 部署应用程序中重写 ocx 的安装,但我们可能不得不为更多应用程序执行此操作。并不是我们不想使用 installshield,只是我们试图在微软的 ClickOnce 部署系统中包装一套使用 installshield 的应用程序,所以我们必须了解所有 dll 和 ocxs 是如何注册和安装的,这样我们才能在.net中复制它。目标受众被认为是低专业知识,不希望转播非自动化安装。
    • 哦,只是通常的嫌疑人——比如你尝试了哪些版本的 IS、Windows 等,以及每个版本的行为。例如,如果它在 Windows XP 上与 regsvr32 一起工作,而在 Vista 上失败,那将证明我所说的内容,而如果它从未工作过,或者在 Vista 上工作但在 Windows 7 上失败,则可能是别的东西。
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多