3

我正在维护一个带有许多 COM 组件(DLL 和 OCX)的 VB6 应用程序。为了简化开发和部署,我想使用 reg-free com。开发的问题是应用程序在 VB6.EXE 实例中运行。如何欺骗 VB6 使用我的(未注册的)组件?在分支之间切换时不必通过注册/注销组件对我来说非常重要。为 VB6 生成 .manifest 文件并非不可能,但是否有其他更优化的方法可以在启动 VB6.EXE 时指定 .manifest 文件?

注意:Activation Context API 似乎没有帮助,即使在开发环境中使用也是如此。

我想到的解决方案:

  • 从清单激活上下文并将 VB6 作为子进程启动的实用程序应用程序(不起作用;进程不继承激活上下文)
  • 在启动时将上下文激活注入 VB6 进程(太复杂;必须破解可执行文件才能执行此操作)
  • 在激活正确的上下文后在我自己的进程中托管 VB6(甚至无法确定这是否可能)
  • 使用 VB6 加载项或在 VB6 中运行的其他实用程序来激活上下文(尝试过,但似乎不起作用)

1月16日更新

正如wqw所建议的,我使用 VB.exe.manifest 进行了一些测试。VB6.exe.manifest 有效,但有一些注意事项:

  • 清单中指定的 SxS dll 不会出现在未实际引用该组件的项目的引用窗口中
  • 在确实引用该组件的项目上,它将按照以下顺序显示在目录中:

    1. 项目文件中记录的路径名(如果文件仍然存在)
    2. 路径名,就好像它与项目位于同一文件夹中一样 (vbp)

    如果文件不在这些文件夹中,则项目将无法编译(仅运行代码会导致 VB6 中的内部编译)并显示消息“找不到项目或库”。

显然,VB6 实际上会扫描注册表以查找 COM 组件,并在编译期间验证它们是否存在于它们所说的位置。如果我真的想使用 VB6.exe.manifest 来重定向 COM 组件实例化,我不确定这可能意味着什么。也许在某个预定义的位置拥有虚拟组件文件可能会诱使 VB6 相信一切都是应有的,尽管加载了一组完全不同的组件以供使用。

进一步更新:

我对最后一个假设进行了测试,结果证明它是错误的。该组件必须实际存在才能编译项目。它甚至必须正确加载(不接受虚拟的零长度文件!)。现在我什至不确定清单是否有效。这是一个更耗时的测试(需要一个具有两个版本的组件,产生不同的结果,一个用于项目,一个用于清单)。

4

1 回答 1

2

我们解决这个问题的方法是编写一个构建辅助程序来注册和取消注册组件,运行 VB6 编译器,甚至在接口更改时使用更新的 GUID 重写项目文件。您将交给它一个 VBG 项目组,然后它会完成剩下的工作。

我想我们也可以添加一个模式,当你切换分支时取消注册组件。

您是否遵循使用“兼容性”二进制文件的做法?您不应该在构建位置使用二进制文件作为兼容性参考 - 您应该将单独的副本提交给版本控制并配置您的项目以考虑“兼容”版本 - 仅在中断接口时更改此文件。

于 2013-06-27T22:12:15.680 回答