使用VB6开发无需注册的COM应用程序

4
我正在维护一个VB6应用程序,其中包含许多COM组件(DLL和OCX)。为了简化开发和部署流程,我想使用reg-free com。开发时的问题在于应用程序在VB6.EXE实例中运行。我该如何欺骗VB6使用我的(未注册的)组件?对我来说,不必在分支之间进行组件的注册/注销非常重要。生成VB6的.manifest文件并不是不可能的,但是否有其他更优选的方法可以指定在启动VB6.EXE时使用.manifest文件呢?
注意:即使在开发环境中使用Activation Context API也似乎没有帮助。
我想到的解决方案:
- 一个实用程序应用从.manifest激活上下文并启动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,使其相信一切都是应该的,尽管加载了完全不同的组件供使用。

进一步更新:

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


1
你尝试过为单个无注册依赖的DLL/OCX手动创建VB6.exe.manifest文件吗?我认为它不会按预期工作。 - wqw
实际上...不是。但是有人报告说他们已经成功地完成了这个任务。我会尝试一下并回复你的。 - Doc
我正在尝试在VB6中运行一个带有清单的程序,以便调试regfreecom dll,但是当运行时它会抛出一个错误 - 你的vb6.exe.manifest的内容是什么? - Carl Onager
@doc 我已经让我的工作了。如果您能添加一个细节回答说明您是如何让您的工作的,那就太好了。 - Carl Onager
你的大部分问题在于试图将一个打包和部署技术用作开发技术。 - Bob77
@Bob77 这不是一个坏的表达方式。 - Doc
1个回答

2
我们解决这个问题的方法是编写一个构建助手程序,它可以注册和注销组件,运行VB6编译器,甚至在接口更改时重写项目文件的更新GUID。您只需提供一个VBG项目组,它就会完成其余工作。
我想我们也可以添加一种模式,即在切换分支时注销组件。
你是否遵循使用“兼容性”二进制文件的做法?你不应该使用构建位置上的二进制文件作为兼容性引用 - 你应该将一个独立的副本提交到版本控制,并配置你的项目将其视为“兼容”版本 - 只有在打破接口时才更改此文件。

这基本上也是我所做的。拥有一批或其他脚本,可以注销/注册所需的任何内容。作为解决这个超过20年的问题的权宜之计,美观、简单而有效。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接