在VB6中查找循环引用

在VB6中查找循环引用,vb6,Vb6,我试图在VB6中编译一些代码,它告诉我“模块之间的循环依赖关系”,而不是告诉我哪些模块具有这些依赖关系 有什么方法可以让我找到关于这个问题的更多信息吗?您的项目形成了一个循环的参考链。使用菜单“项目”和“引用”查看哪些其他项目是您的引用。然后对作为应用程序一部分的所有其他项目执行此操作。画一个粗略的图表,说明什么链接到什么,在某个点上,你会发现引用循环回到其中一个项目 您只需要关注对您自己创建的项目的引用。此外,您还需要检查您创建的任何包含自定义ActiveX控件的项目。这可以在菜单“项目->组

我试图在VB6中编译一些代码,它告诉我“模块之间的循环依赖关系”,而不是告诉我哪些模块具有这些依赖关系


有什么方法可以让我找到关于这个问题的更多信息吗?

您的项目形成了一个循环的参考链。使用菜单“项目”和“引用”查看哪些其他项目是您的引用。然后对作为应用程序一部分的所有其他项目执行此操作。画一个粗略的图表,说明什么链接到什么,在某个点上,你会发现引用循环回到其中一个项目

您只需要关注对您自己创建的项目的引用。此外,您还需要检查您创建的任何包含自定义ActiveX控件的项目。这可以在菜单“项目->组件”下找到

您可能会发现您引用的类很少。在这种情况下,您可以将它们分离到另一个activex DLL/库中,并使原始项目相互引用


出现此问题的原因是COM依赖嵌入在库中的类型库来调用类及其方法。引用的库以类似于C中包含文件的方式包含在此类型库中。循环引用没有“底部”,因此COM无法到达最底部的库来形成类型库。

我发现了另一种情况,即出现这种情况以及解决方案。如果重命名库(项目/属性下的项目名称),并传递具有完全限定类型名称的对象引用,如:

Sub Example(ByVal myControl As Library.Classname)
然后必须搜索并将其替换为(包括前导空格和尾随点,以防止不必要的匹配)。对FRM、BAS、CLS和CTL文件扩展名执行此操作

Sub Example(ByVal myControl As NewLibraryName.Classname)
请注意,在执行上述操作之前,您必须先修复CTL和FRM文件,以便首先加载项目(在获得循环依赖项错误之前)。与上面类似,该过程涉及将“BeginLibrary.”替换为“BeginNewName.”


享受吧

这不是答案,但至少你还有其他观点@Carlos不幸的是,对于两个相互引用的类,Xodarap不会产生错误。Xodarap错误是当COM引用链形成循环引用时,根据COM规则,循环引用是不允许的。我最终通过注释
实现
并查看它何时开始编译来解决这个问题。不过,我希望有一个更快的解决方案——我在一家大公司工作,如果我处理的是一个更大的项目,那么手动完成它将花费永远的时间。@Xodarap:Typelibs只包括项目中类的公共方法/属性。如果您尝试不在这些文件中包含“外来”数据类型,则不会生成importlib。将外部LIB保持在最低限度是最佳做法。我经常使用
作为对象
而不是强类型接口,并且在我的公共接口上使用
作为长
而不是“外来”枚举。如果使用As对象,请确保测试性能。因为VB6解析对后期绑定对象的引用需要十倍的时间。此外,您还失去了编译时类型检查的所有好处。就像任何东西一样,您需要了解该功能的优点和缺点。@RS Conley:在使用这些功能之前,我总是将
作为对象
params/properties强制转换为本地强类型变量。这是一种精神检查。