Visual c++ 无效的外部类型库引用(“加载DLL时出错”)

Visual c++ 无效的外部类型库引用(“加载DLL时出错”),visual-c++,vb6,typelib,Visual C++,Vb6,Typelib,虽然我正在进行VB6开发,但我认为这是一个更广泛的问题。我发现有时候在VB IDE中会出现错误:[BadImplementsFinCompatilib]。使用Matt Curland的“Advanced Visual Basic 6”附带的类型库查看器,它会标记我的组件中的类型库引用了一个找不到的类型库,但不是它是什么。当TLI组件试图查找在另一个类型库中定义的接口时,潜在错误与TLI组件有关 我还尝试了OLE View—尝试反向编译IDL—但在尝试获取外部类型时,它再次发出错误消息,而没有识别

虽然我正在进行VB6开发,但我认为这是一个更广泛的问题。我发现有时候在VB IDE中会出现错误:[BadImplementsFinCompatilib]。使用Matt Curland的“Advanced Visual Basic 6”附带的类型库查看器,它会标记我的组件中的类型库引用了一个找不到的类型库,但不是它是什么。当TLI组件试图查找在另一个类型库中定义的接口时,潜在错误与TLI组件有关

我还尝试了OLE View—尝试反向编译IDL—但在尝试获取外部类型时,它再次发出错误消息,而没有识别错误的值

我将实际错误追溯到注册表中指向组件的类型库引用,但主版本不正确。替换主版本修复了该问题

我使用了一个二进制编辑器来查看是否能够发现类型库中正在使用的信息。事实上,我找到了它引用的组件的名称(没有路径),但我无法计算出格式。我实际上希望找到一个类型库guid和版本号的表。我想我可以编写代码来提取这些名称,并消除“工作”引用,但这有点粗糙


有人知道类型库如何引用外部类型吗?

[BadImplementsFinCompatilib]
表示二进制兼容目标的类型库引用了外部类型库,而此外部类型库未注册

例如,如果您有一个包含多个ActiveX DLL的项目组,这些DLL设置为二进制兼容版本兼容性
Project2
引用
Project1
(在公共类的函数/属性原型上使用Project1中的类型)当
Project1
中断兼容性并重新编译
Project2
时,兼容目标的typelib引用了未注册的外部typelib(即
Project1
组件的旧版本)

在我们的商店里,我们确实有跨VB6项目的引用,但从来没有在类的公共方法/属性上使用core中的类型。这样的参数被声明为对象和向下转换代码,这比使用外部交叉引用绑定组件要容易。Curland的
EditTLB
经常被用来发现有问题的类

不知道类型库如何引用外部类型。我只是在idl中导入
importlib(“component.tlb”)
,并随意使用
component
中的类型


顺便说一句,在VB6 IDE中“保护”COM组件(DLL/OCX)不被使用的一种非常简单的方法是在外部定制的typelib(公共方法的参数)中引用
struct
,然后“忘记”发布此外部typelib。VB6 IDE在添加对DLL/OCX的引用时会遇到“加载DLL时出错”的问题,但如果您不尝试跨线程(进程中或非进程中)调用此“模糊”方法,则该组件可以正常工作和注册。

类型库有一个版本号是有充分理由的。您可以编辑此问题,但当您调用已更改的过程时,这只会在运行时产生不可诊断的故障。只有获得并注册正确的类型库才是解决方案。@HansPassant-我完全理解类型库版本控制的要点。不幸的是,TLI组件的行为并不是很有帮助——它会引发一个错误,但没有提供某种形式的信息,说明为什么它无法解析引用,以便我可以采取适当的措施。目前,我不得不猜测它为什么不起作用!是的,我从自己的实验中得到了大概的要点。不幸的是,我使用的代码来自10多年的开发,有150多个组件,所有这些组件都具有交叉依赖性。有趣的是,您的商店已经基本上放弃了在公共界面上使用自己的类型。回想起来,这就是我正在使用的代码应该做的事情。然而,我仍然坚持我所拥有的,如果能找到一种方法来追踪这些仅限于开发的错误的依赖链并轻松修复它们,那将是一件好事。你如何编译这150多个组件?您必须根据它们的交叉依赖项对它们进行拓扑排序,因此您必须记录这些引用。如果您有一个构建服务器,开发人员应该永远不需要在他们的机器上编译组件(如果他们需要,那么只需要在服务器上启动构建)。我们在开发机器上保持vbp在项目中的兼容性,并且永远不会得到
[BadImplements]
。IDE在项目兼容性方面也变得更加灵敏。我们使用Nant来构建这些组件。是的,我们必须整理所有的依赖关系。我们唯一没有做的就是在开发人员机器上使用项目兼容性。老实说,我认为这只在编译组件时才重要。在项目运行时使用项目兼容性是否本质上告诉IDE“修复”所有引用?在项目兼容性IDE中,只检查typelib ID,不检查或关心类ID或接口ID,因此兼容性目标的库GUID是唯一读取的内容,与项目的当前源代码不匹配。所以IDE中的编译速度要快得多,包括后台编译(对于intellisense),这发生在IDE中的源代码导航上(也在进入空间时)。如果有时在IDE中修改依赖组件公共类,二进制兼容性通常会因“内存不足”而受阻。