使用VB6开发无Reg-COM应用程序

问题描述:

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

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

解决方案,我想:

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

更新1月16日

正如wqw的建议,我做了一些测试用VB。 exe.manifest。该VB6.exe.manifest工作,与一些注意事项:

  • 清单中指定的DLL的SxS将不会出现在引用窗口上实际上并没有引用该组件
  • 在那做项目工程引用将它示出了根据下列顺序驻留在目录中的组件:

    1. 记录在项目文件(如果文件仍然存在)的路径名
    2. 的路径名,就好像它在居住与t相同的文件夹他项目(vbp)

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

显然,VB6 actualy扫描注册表中找到COM组件和验证,在编译过程中,它们的存在,他们说他们的存在。我不确定如果我真的想要使用VB6.exe.manifest来重定向COM组件实例化,这可能意味着什么。也许虚拟组件文件在某个预定义的位置可能会使VB6相信所有东西都是它应该是的,尽管一组完全不同的组件被加载使用。

进一步更新:

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

+1

您是否为单个免注册DLL/OCX尝试使用手动VB6.exe.manifest?我不认为它会按预期工作。 – wqw

+0

其实......不。但是人们报告说他们已经成功完成了。我会尝试一下,然后回到你身上。 – Doc

+0

我试图让VB6运行一个清单为了调试一个regfreecom dll,但它在运行时抛出一个错误 - 你的vb6.exe.manifest的工作内容是什么? –

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

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

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