2012-11-09 84 views
1

虽然我在做VB6开发,但我认为这是一个更广泛的问题。我发现有时在VB IDE中会出现一个错误:[BadImplementsRefInCompatLib]。使用Matt Curland的“高级Visual Basic 6”附带的类型库查看器,它标志着我的组件中的类型库有一个它找不到的类型库的引用,但不是它是什么。当TLI组件试图找出在另一个类型库中定义的接口时,底层的错误与TLI组件有关。无效的外部类型库引用(“错误加载DLL”)

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

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

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

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

+1

类型库有一个版本号有一个很好的理由。您可以编辑此问题,但在调用已更改的过程时,这只会在运行时产生无法识别的故障。只有获得并注册正确的类型库才是解决方案。 –

+0

@HansPassant - 我完全理解版本化类型库的要点。不幸的是,TLI组件的行为并不是非常有用 - 它提供了一个错误,但没有提供某种形式的关于* why的信息*它无法解析引用,所以我可以采取适当的措施。此刻,我必须猜测为什么它没有奏效! –

回答

2

[BadImplementsRefInCompatLib]意味着您的二进制兼容目标的typelib具有对外部typelib的引用,并且此外部typelib未注册。

举例来说,如果你有多个ActiveX DLL的一个项目组被设置为二进制兼容的版本兼容性Project2引用Project1Project1休息的兼容性和(在一个公共类的功能/性能的原型使用的类型从PROJECT1)得到重新编译Project2的兼容性目标有一个typelib引用未注册的外部typelib(即旧版本的Project1组件)。

在我们的商店中,我们确实提供了跨VB6项目的参考,但从未在类的公共方法/属性中使用核心类型。这些参数被声明为As Object,并以代码方式向下转换,这比与外部交叉引用绑定组件相比麻烦少。经常使用Curland的EditTLB来发现违规课程。

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

顺便说一句,在VB6 IDE中“保护”COM组件(DLL/OCX)的一个非常简单的方法是在外部定制的typelib(公共方法的参数)中引用struct,然后“忘记”运送此外部typelib。如果您不尝试调用此“混淆”方法的交叉线程(正在处理或未处理),VB6 IDE扼流器将与“DLL加载错误”添加对DLL/OCX的引用,但该组件工作并完美注册。

+0

是的,我从我自己的实验中得到了一般的要点。不幸的是,我正在使用超过10年的开发代码,并且有150多个组件,所有这些组件都具有交叉依赖性。有趣的是,您的商店基本上放弃了在公共界面上使用自己的类型。回想起来,这就是我正在使用的代码应该完成的工作。但是,我坚持我所拥有的,并且有一种方法可以追溯这些仅限于开发的错误的依赖关系链并轻松修复它们。 –

+0

你如何编译这150多个组件?你必须对它们的交叉依赖关系进行topolically排序,所以你必须保持这些引用的记录。如果你有一个构建服务器,开发者永远不需要在他们的机器上编译组件(如果他们需要的话,就直接在服务器上开始构建)。我们在开发机器上保持vbp的项目兼容性,并且永远不会获得'[BadImplements]'。 IDE在项目兼容性方面也得到了更多的响应。 – wqw

+0

我们使用Nant来构建这些组件。是的,我们必须理清所有的依赖关系。我们唯一不做的就是在开发机器上使用项目兼容性。说实话,我认为这只在编译组件时很重要。在项目运行时使用项目兼容性是否基本上告诉IDE“修复uo”所有的引用? –

相关问题