Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Com 什么可能导致Vb6运行时错误430_Com_Vb6 - Fatal编程技术网

Com 什么可能导致Vb6运行时错误430

Com 什么可能导致Vb6运行时错误430,com,vb6,Com,Vb6,我有一个用vb6编写的COM dll。当我尝试从此dll创建类模块的新对象时,我得到一个运行计时器错误430:类不支持自动化或不支持预期接口。有趣的是,这只发生在IDE外部,当我在IDE内部调试时,没有抛出错误,并且成功创建了类的新对象。原因可能是什么 一般来说,我偶尔会在COM DLL中遇到此类错误。调试COM问题的最佳方法是什么?如何知道程序运行时使用的dll的路径?这几乎肯定是一个版本控制问题,有时称为“dll地狱” 背景是.NET世界被明确设计为让接口在保持相同名称的同时不断发展。但在C

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


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

这几乎肯定是一个版本控制问题,有时称为“dll地狱”

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

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


编辑:出于某种原因,我假设您试图使用.NET组件中的COM组件。如果整个解决方案实际上是VB6,那么康利先生的解决方案就是推荐的方法。这将讨论问题。

如果此项目完全使用VB6。这可能是因为EXE的目录中有一个DLL二进制文件的副本。激发时,它使用该副本而不是编译副本。添加方法或类时,EXE将与旧DLL不兼容。如果你做了一个错误修复或只是与内部代码,然后EXE将运行,但它使用了旧的DLL

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


所有这些步骤都将有助于避免DLL地狱。我自己的项目在6层中有24个ActiveX项目。当我采用上述DLL时,我的地狱问题几乎消失殆尽。

以兼容的方式阅读二进制与project

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

如果必须进行破坏性更改(如删除旧的公共方法),请使用项目兼容性-但是如果这样做,则必须重新编译使用共享DLL的所有其他应用程序