【问题标题】:Invalid external type library references ("Error loading DLL")无效的外部类型库引用(“加载 DLL 时出错”)
【发布时间】:2012-10-29 19:38:53
【问题描述】:

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

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

我将实际错误追溯到注册表中指向组件的类型库引用,但主要版本不正确。更换主要版本解决了这个问题。

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

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

【问题讨论】:

  • 类型库有一个版本号是有充分理由的。您可以编辑此问题,但是当您调用已更改的过程时,只会在运行时产生无法诊断的故障。只有获取并注册正确的类型库才是解决之道。
  • @HansPassant - 我完全理解类型库版本控制的意义。不幸的是,TLI 组件的行为不是很有帮助 - 它引发了一个错误,但没有提供有关 为什么 它无法解析引用的某种形式的信息,因此我可以采取适当的措施。目前,我不得不猜测为什么它没有奏效!

标签: visual-c++ vb6 typelib


【解决方案1】:

[BadImplementsRefInCompatLib] 表示您的二进制兼容目标的类型库引用了外部类型库,并且此外部类型库未注册。

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

在我们的商店中,我们确实有跨 VB6 项目的引用,但从未在类的公共方法/属性上使用核心类型。这些参数被声明为As Object 并在代码中向下转换,这比将组件与外部交叉引用绑定起来更容易。 Curland 的EditTLB 经常用于发现违规课程。

不知道类型库如何引用外部类型。我只是在 idl 中 importlib("component.tlb") 并随意使用来自 component 的类型。

顺便说一句,在 VB6 IDE 中“保护”COM 组件(DLL/OCX)不被使用的一种非常简单的方法是在外部自定义类型库(公共方法的参数)中引用struct,然后“忘记" 来发布这个外部类型库。 VB6 IDE 在添加对 DLL/OCX 的引用时因“加载 DLL 时出错”而窒息,但组件工作并完美注册,前提是您不要尝试跨线程调用此“混淆”方法(无论是否在进程中)。

【讨论】:

  • 是的,我从自己的实验中得到了大致的要点。不幸的是,我正在使用超过 10 年开发的代码,并且有 150 多个组件,所有这些组件都具有交叉依赖关系。有趣的是,您的商店基本上放弃了在公共接口上使用自己的类型。回想起来,这就是我正在使用的代码应该做的事情。但是,我坚持我所拥有的,如果有一种方法可以追溯此类仅用于开发的错误的依赖链并轻松修复它们,那就太好了。
  • 如何编译这 150 多个组件?您必须根据它们的交叉依赖关系对它们进行拓扑排序,因此您必须将这些引用记录在案。如果你有一个构建服务器,开发人员永远不需要在他们的机器上编译组件(如果他们需要,那么只需在服务器上启动构建)。我们在开发机器上保持 vbp 的项目兼容性,并且永远不会得到[BadImplements]。 IDE 在项目兼容性方面也变得更加灵敏。
  • 我们使用 Nant 来构建这些组件。是的,我们必须理清所有的依赖关系。我们唯一不做的就是在开发机器上使用项目兼容性。老实说,我认为这仅在编译组件时才重要。在项目运行时使用项目兼容性是否本质上是告诉 IDE “修复 uo”所有引用?
  • 在项目兼容性 IDE 中只检查 typelib ID,不检查或关心类 ID 或接口 ID,因此兼容性目标的 lib GUID 是唯一读取的内容,没有与项目当前源代码匹配的内容。因此,在 IDE 中编译会变得更快,包括后台编译(用于智能感知),它发生在 IDE 中的源代码导航中(也可以在进入空间时)。如果有时在 IDE 中修改依赖组件公共类,二进制兼容性通常会因“内存不足”而窒息。
猜你喜欢
  • 2011-01-17
  • 2012-12-15
  • 1970-01-01
  • 2020-07-25
  • 2011-03-04
  • 2019-01-23
  • 1970-01-01
  • 2018-03-03
  • 2010-10-01
相关资源
最近更新 更多