虽然我正在进行VB6开发,但我认为这是一个更广泛的问题。我发现有时在VB IDE中我们会收到错误:[BadImplementsRefInCompatLib]。使用Matt Curland的“Advanced Visual Basic 6”附带的类型库查看器,它标记我的组件中的类型库引用了它找不到的类型库,但不是它的内容。当TLI组件试图找出在另一个类型库中定义的接口时,底层错误就是TLI组件。
我也尝试过OLE视图 - 试图反向编译IDL - 但是再一次,它在尝试获取外部类型时给出了错误消息,而没有识别出错误的值。
我将实际错误追溯到注册表中指向组件的类型库引用,但主要版本不正确。替换主要版本修复了问题。
我使用二进制编辑器来查看是否可以找到类型库中使用的信息。事实上,我找到了它引用的组件的名称(没有路径),但我无法确定格式。我实际上希望找到一个类型库GUID和版本号的表。我想我可以编写代码来提取这些名称,并消除“工作”引用,但这有点粗糙。
有谁知道类型库如何引用外部类型?
答案 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>