用VB6开发Reg-Free COM应用程序

时间:2013-01-09 13:35:41

标签: vb6 regfreecom winsxs sxs

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

注意:激活上下文API似乎没有帮助,即使在开发环境中使用也是如此。

我认为的解决方案:

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

1月16日更新

根据wqw的建议,我使用VB.exe.manifest进行了一些测试。 VB6.exe.manifest有一些注意事项:

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

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

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

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

进一步更新:

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

1 个答案:

答案 0 :(得分:1)

我们解决这个问题的方法是编写一个构建辅助程序,注册和未注册的组件,运行VB6编译器,甚至在接口更改时用更新的GUID重写项目文件。你可以把它交给一个VBG项目组,剩下的就完成了。

我想我们也可以在切换分支时添加一个未注册组件的模式。

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