【问题标题】:createObject in VB6 does fails when running exe运行 exe 时,VB6 中的 createObject 确实失败
【发布时间】:2011-06-05 06:21:32
【问题描述】:

我有一个 VB6 程序,它试图运行一个用 C# 编写的 DLL。
这个 DLL 有一个 COM 接口,所以我可以使用“CreateObject”在其中创建一个类的对象。 问题是当我从 VB6 IDE 运行它时它运行良好,但是当我制作一个 EXE 并尝试运行它时,它会抛出异常:
“自动化错误。系统找不到指定的文件(-2147024894)。”

为什么会发生,我该如何解决?

【问题讨论】:

  • 什么操作系统?您是否以标准用户身份运行 IDE 提升与编译程序?您能否展示一个失败的小程序,即某些代码但不是缺少重要细节的代码 sn-p?请包括对象引用变量的声明,以便我们查看您是后期绑定还是早期绑定。

标签: vb6 createobject


【解决方案1】:

查看 IDE 中的 Project、References 并查看哪个 dll 或 ocx 文件属于您使用 CreateObject 引用的对象(对象管理器也可能有助于找出)。 该 dll 文件也必须在编译 exe 时可用。通常,您需要将其注册到 regsvr32.exe。

【讨论】:

    【解决方案2】:

    我用来解决此类问题的一种方法是在 Visual Basic 6 中打开“添加引用”对话框。我滚动可用 COM 库的列表并查看是否列出了问题 DLL。如果是,那么 CreateObject 应该可以工作,您应该能够为其分配一个变体变体并使用后期绑定来访问它的成员。

    另外尝试临时设置对变量的引用,而不是使用 CreateObject 使用 = New 并查看它给您的错误消息(如果有)。一般来说,我发现它们比 CreateObject 抛出的信息更丰富。

    最后,如果您发布您选择使用 CreateObject 而不是设置参考的原因,这将有所帮助。如果 DLL 是程序将持续使用的已知对象,则应设置引用并通常使用早期绑定。

    最后,错误可能是由于 C# COM DLL 的依赖性而不是 DLL 本身引起的。例如,如果我要获取一个 Com 库并正确注册它,但它依赖于 COM 库 Widget2000 并且它没有注册,那么它将引发自动化错误。特别是如果您在它的安装环境中测试 EXE,而不是在您编译它的环境中。

    例如,假设我有一个用 VB6 编写的 CAD 程序,并且我有一个以 MyCAD 开头的源代码树。 exe 在 MyCAD/MainEXE 中,形状库在 MyCAD/ShapeLibrary 中。我运行IDE一切都很好。然后我进行设置并转到我的测试机器并安装它,它在创建 shapelibrary 时出错。

    我要做的第一件事是检查 MainEXE 是否会直接从我的源代码树的 MainEXE 目录中运行。该测试将消除它是安装问题还是 IDE 与已编译版本的怪癖。然后我会查看设置并查看未注册的内容。还要查看 C# 库的源代码或库的设置,看看它需要哪些依赖项。由于它是一个编译好的 COM DLL,您应该能够使用依赖遍历器工具来查看它需要哪些 COM 引用。最后确保安装了正确版本的 .NET 框架。

    【讨论】:

      【解决方案3】:

      如果您在测试机器上编译 C# DLL - 请确保您已勾选 register for COM Interop setting。如果您不在同一台机器上编译,则需要使用 /codebase 选项运行 RegAsm

      【讨论】:

        【解决方案4】:

        尝试将其编译为安装程序,并将您使用的 dll/com 包含在安装程序包的编译中,以便您使用的 dll/com 将包含在您的 exe 编译中..,并将其安装在windows不只是复制过去而已。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-15
          • 1970-01-01
          相关资源
          最近更新 更多