我正在维护一个带有许多COM组件(dll和ocx)的VB6应用程序。为了简化开发和部署,我想使用regfree.com。开发的问题是应用程序在VB6.EXE实例中运行。我如何欺骗VB6使用我的(未注册的)组件?对我来说,在分支之间切换时不必经历注册/取消注册组件是非常重要的。生成一个。manifest文件为VB6不是没有问题,但是否有一些其他的,更优化的方式,以指定一个。manifest文件时启动VB6. exe ?
注意:激活上下文API似乎没有帮助,即使在开发环境中使用。
我想过的解决方案:
- 从清单中激活上下文并将VB6作为子进程启动的实用程序(不工作;进程不继承激活上下文)
- 在启动时向VB6进程注入上下文激活(太复杂;必须破解可执行文件才能做到这一点)
- 在激活正确的上下文后,在我自己的进程中托管VB6(甚至无法发现这是否可能)
- 使用VB6插件或其他在VB6内运行的实用程序来激活上下文(尝试过,但似乎不起作用)
1月16日更新
根据wqw的建议,我用VB.exe.manifest做了一些测试。VB6.exe。清单工作,有一些注意事项:
- 清单中指定的SxS dll不会出现在没有实际引用该组件的项目的引用窗口中
-
对于确实引用了该组件的项目,它将按照以下顺序显示在目录中:
- 项目文件中记录的路径名(如果文件仍然存在)
- 路径名,就好像它与项目(vbp)位于同一文件夹中
如果文件不在这些文件夹中,项目将不会编译(只是运行代码导致在VB6中进行内部编译),并提示"无法找到项目或库"。
显然,VB6实际上扫描注册表以查找COM组件,并在编译期间验证它们是否存在于它们所说的位置。我不确定这可能意味着什么,如果我真的想使用VB6.exe。manifest来重定向COM组件实例化。也许在某个预定义的位置放置虚拟组件文件可能会欺骗VB6,使其相信一切都应该是这样,尽管加载了一组完全不同的组件。
进一步更新:我对最后一个假设做了测试,结果证明它是错误的。为了使项目能够编译,组件必须实际存在。它甚至必须正确加载(不接受假的、零长度的文件!)现在我都不确定舱单是否有效。这是一个更耗时的测试(需要一个具有两个产生不同结果版本的组件,一个用于项目,一个用于清单)。
我们解决这个问题的方法是编写一个构建辅助程序,该程序可以注册和注销组件,运行VB6编译器,甚至可以在接口更改时使用更新的guid重写项目文件。你交给它一个VBG项目组,它会做剩下的事情。
我想我们还可以添加一个模式,当你切换分支时取消注册组件。
您是否遵循使用"兼容性"二进制文件的实践?您不应该在构建位置使用二进制文件作为兼容性参考-您应该提交一个单独的副本到版本控制并配置您的项目以考虑"兼容"版本-仅在您破坏接口时更改此文件。