2008-11-11 112 views
10

我有一个用vb6编写的COM DLL。当我尝试从这个DLL创建一个类模块的新对象时,我得到一个运行计时器错误430:类不支持自动化或不支持预期的接口。有趣的是,这只发生在IDE之外,当我从IDE内部调试时,没有抛出任何错误,并且类的新对象被成功创建。原因是什么?什么可能会导致Vb6运行时错误430

一般来说,我偶尔会在COM dll中遇到这类错误。调试COM问题的最佳方法是什么?如何知道程序运行时正在使用的dll的路径?

回答

9

如果这个项目完全在VB6中。造成这种情况的可能原因是EXE在目录中有一个DLL二进制文件的副本。当你启动它时,使用该副本而不是编译副本。当您添加EXE与旧DLL不兼容的方法或类时。如果你做了一个错误修复或者只是使用了内部代码,那么EXE将运行,但它使用了旧的DLL。

将您的DLL设置为二进制兼容性。 确保您有兼容的目录。 将最后一个版本的DLL放在那里。 将二进制兼容性指向该DLL。 确保您的EXE编译为它的项目目录。 从它的项目目录运行EXE。这样它将使用您编译的DLL。 您需要编写一个实用程序,以便您可以分别编译每个项目。 使用Virtual PC或其他计算机测试您的设置。

所有这些步骤将有助于避免DLL地狱。我自己的项目有6个层次上的二十个ActiveX项目。当我通过上述我的DLL地狱问题几乎没有下降。

2

这几乎可以肯定是一个版本问题,有时称为“DLL地狱”。

背景是.NET世界被明确设计为让接口在保持相同名称的同时进化。但在COM世界中,接口被认为是不可变的。

当您在IDE中工作时,每次运行解决方案时,Visual Studio都会为COM dll创建一个新的COM Interop包装。但除非您每次发布并替换整个解决方案,包括全新的COM Interop包装器,否则您将遇到版本控制问题,其中.NET代码期望一个COM接口但看到另一个COM接口。

编辑:出于某种原因,我假定您正在尝试使用.NET组件中的COM组件。如果整个解决方案实际上是VB6,那么Conley先生的解决方案就是推荐的方法。讨论这个问题的Here's a good link

4

阅读二进制与项目兼容。

如果你有你必须要小心,并兼容使用二进制共享DLL。这样VB6将保持构建之间相同的COM签名/接口。你必须有一个VB6发布DLL的副本进行比较 - 我通常有一个单独的文件夹发布的二进制文件。二进制兼容性的限制是您不能删除公共属性或方法,也不能更改其签名。您可以添加新的属性和方法。

使用项目的兼容性,如果你必须做出重大更改(如删除旧的公共方法) - 但是如果你这样做,你将不得不重新编译使用共享的DLL的所有其他应用程序。

相关问题