【问题标题】:What could cause Vb6 run time error 430什么可能导致 Vb6 运行时错误 430
【发布时间】:2010-09-21 18:39:21
【问题描述】:

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

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

【问题讨论】:

    标签: com vb6


    【解决方案1】:

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

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

    所有这些步骤将有助于避免 DLL Hell。我自己的项目有两个 6 层的 ActiveX 项目。当我采用上述方法时,我的 DLL Hell 问题几乎消失了。

    【讨论】:

      【解决方案2】:

      兼容地阅读二进制与项目。

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

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

      【讨论】:

        【解决方案3】:

        这几乎肯定是版本控制问题,有时被称为“DLL 地狱”。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多