我正在维护一个带有许多 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 不会出现在未实际引用该组件的项目的引用窗口中
在确实引用该组件的项目上,它将按照以下顺序显示在目录中:
- 项目文件中记录的路径名(如果文件仍然存在)
- 路径名,就好像它与项目位于同一文件夹中一样 (vbp)
如果文件不在这些文件夹中,则项目将无法编译(仅运行代码会导致 VB6 中的内部编译)并显示消息“找不到项目或库”。
显然,VB6 实际上会扫描注册表以查找 COM 组件,并在编译期间验证它们是否存在于它们所说的位置。如果我真的想使用 VB6.exe.manifest 来重定向 COM 组件实例化,我不确定这可能意味着什么。也许在某个预定义的位置拥有虚拟组件文件可能会诱使 VB6 相信一切都是应有的,尽管加载了一组完全不同的组件以供使用。
进一步更新:
我对最后一个假设进行了测试,结果证明它是错误的。该组件必须实际存在才能编译项目。它甚至必须正确加载(不接受虚拟的零长度文件!)。现在我什至不确定清单是否有效。这是一个更耗时的测试(需要一个具有两个版本的组件,产生不同的结果,一个用于项目,一个用于清单)。