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

时间:2012-11-09 13:17:36

标签: visual-c++ vb6 typelib

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

我也尝试过OLE视图 - 试图反向编译IDL - 但是再一次,它在尝试获取外部类型时给出了错误消息,而没有识别出错误的值。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

在我们的商店中,我们确实有VB6项目的参考,但从未在类的公共方法/属性上使用核心类型。这些参数在代码中声明As Object并向下转换,这比使用外部交叉引用绑定组件要麻烦。 Curland的EditTLB经常用于发现有问题的课程。

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

顺便说一下,在VB6 IDE中“保护”COM组件(DLL / OCX)的一种非常简单的方法是引用外部自定义类型库中的struct(公共方法的参数),然后“忘记”运送这个外部类型库。 VB6 IDE在添加对DLL / OCX的引用时会出现“加载DLL错误”,但该组件可以完美地工作和注册,前提是您不要尝试跨线程调用这种“混淆”方法(在进程中或不进行中)。 / p>