【问题标题】:What does "Method '~' of object '~' failed" at runtime mean?运行时“对象'〜'的方法'〜'失败”是什么意思?
【发布时间】:2021-09-08 19:06:41
【问题描述】:

我正在尝试在我的桌面上运行旧版 VB6 应用程序(它没有用户界面,是一个命令行应用程序),当我这样做时,我收到一个消息框说

Run-time error '4099':

Method '~' of object '~' failed

这对我来说毫无意义;有人知道出了什么问题吗?

【问题讨论】:

  • 应用程序是做什么的?它是否依赖于任何外部库?有源代码吗?
  • 我确实有源代码,这是一件好事。确实有不同版本的支持库,有些可以追溯到七年前,有些则更近一些,尽管它们最初都是同时构建的。底层代码没有变化,但不同的编译显然产生了足够的差异来导致错误。我确信应用程序在工作站上运行而 dll 在服务器上运行并没有帮助。我重新编译了所有 4 个支持库,然后用这些新的 dll 重新编译了应用程序本身,这就成功了。

标签: com vb6


【解决方案1】:

当支持库(dll 或 ocxs)未正确注册或已安装库的版本与最初编译应用程序的版本不同(且不兼容)时,可能会发生这种情况。

确保所有依赖库都已注册且版本正确。

您可能需要重新编译应用程序才能使其与较新版本的支持库一起使用。

【讨论】:

  • 我会特别关注 MDAC 版本。
  • 好主意,@Jay Riggs。 MDAC 在两个平台上都是相同的版本,所以不是这样。
  • MDAC 通常会抛出错误: Provider could not be found 如果版本有问题,则不太可能。
【解决方案2】:

当 Visual Basic 6 应用程序进行 COM 接口调用并引发异常(即返回失败 HRESULT)时,会出现此消息。在这种情况下,VB6 跳转到异常处理程序(由On Error 设置)。在异常处理程序中有一个可见的对象Err,其中包含异常的详细信息。

如果对象实现了ISupportErrorInfo,并且它确实支持错误信息,并且它确实设置了错误信息,那么Err.Description 采用对象设置的错误信息中的字符串。否则,Err.Description 采用字符串 Method ~ of ~ failed

IDK 其他版本的VB是否做同样的事情;或者如果消息还设置在我刚才描述的场景之外的其他场景中。

【讨论】:

    【解决方案3】:

    另一个原因可能是使用自动化时,Office 的一些次要版本不匹配:

    我有一个旧版 VB5+Access 应用程序(我正在用 Delphi 重写并用干净的 OpenDocument 生成替换所有自动化混乱),它在某些系统上运行良好,但在其他系统上却出现错误。

    在生成 Excel 电子表格时会发生此错误,并且似乎无害(除了烦恼,因为它会显示用户在中间单击“中止”的风险十倍),就好像总是单击“忽略”一样预计。

    我最终发现原因是 Office 97 的安装方式:

    如果 Office 97 安装顺序为:

    • Office 97 SR0 安装光盘
    • 应用 SR1 补丁
    • 应用 SR2 补丁

    但如果它安装了:

    • Office 97 SR1 安装光盘
    • 应用 SR2 补丁

    在受影响的系统上使用 SR1 设置进行卸载/重新安装解决了问题。

    【讨论】:

      【解决方案4】:

      我有 VB6 SP6,我可以重现此行为。在一个新项目中,将此代码放入一个表单中。工程按F5正常运行。右键单击项目并选择发布然后构建输出。这会生成错误消息。

      Option Explicit
      
      Public Sub Init()
          Dim blnErrorHandling As Boolean
      
          If False Then
              blnErrorHandling = True
          Else
              blnErrorHandling = False
      End Sub
      

      现在注释掉最后四行:

      Option Explicit
      
      Public Sub Init()
          Dim blnErrorHandling As Boolean
      
      '    If False Then
      '        blnErrorHandling = True
      '    Else
      '        blnErrorHandling = False
      End Sub
      

      您不再收到错误,并且输出正常构建。我很快添加了一些错误处理来定位崩溃的根源,If False Then 是完全有效的。 MDAC 检查器说一切正常,但重启并没有解决问题。

      【讨论】:

      • 你说得对,If False Then 是有效的,但没有End IfIf 是无效的。你的第一个 sn-p 甚至无法编译。
      • 天哪,我已经离开 VB6 这么久了,在我的 IDE 中检查了按需编译。添加 End If 是解决方案。感谢您的回答!
      【解决方案5】:

      在 VB6 IDE 中转到工具->选项->编辑器并清除拖放文本编辑功能

      感谢 Matthew,您为我指明了正确的方向,尽管我并不完全理解您的问题

      我有一个旧的 VB6 项目要返工,现在可以在 Windows 10 上编辑和重新编译,在重新注册所有 .ocx 文件的通常创伤之后。我通过属性->高级->以管理员身份运行

      的快捷方式运行VB6

      此错误一直存在,每次启动 VB6 IDE 时都会弹出

      阅读 Matthews 的帖子后,我清除了拖放文本编辑功能

      关闭,重新启动VB6,错误消失了

      重新启用拖放,仍然没有错误

      (仍然存在未找到自动化元素的错误)

      【讨论】:

      • 经过这么多年,这对我来说确实有效!
      【解决方案6】:

      Windows 10;

      复制 c:\windows\SysWOW64\COMMTB32.DLL

      过去的 C:\Program Files (x86)\Microsoft Visual Studio\VB98\

      对我有用

      【讨论】:

        【解决方案7】:

        对于作为命令行应用程序运行的 VB6 程序,编译后需要一个额外的阶段:需要在可执行文件上运行 VB6 链接器以将其设置为控制台程序:

        <VB6 dir>\LINK.EXE  /EDIT  /SUBSYSTEM:CONSOLE  <program>.exe
        

        如果不这样做,程序运行时会出现Method '~' of object '~' failed 错误。

        【讨论】:

          【解决方案8】:

          根据我的经验,这是由于 Microsoft Access 版本。

          我的程序是在 MS Office 2007 中制作的,并安装了更新版本的 MS Office。这就是出现此错误的原因。

          【讨论】:

          • 欢迎来到 Stack Overflow!尽管我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为另一个用户已经发布了该解决方案。如果之前的答案对您有帮助,您应该投票而不是重复相同的信息。
          【解决方案9】:

          我的编译程序中有这个错误。调试时没有发生。通过查看所引发错误的 Err.Number 的值,我发现了真正的问题。

          在我的例子中,值是 32811,它是由调用 Dictionary.Remove(key) 引起的,其中 key 不在字典中。调试引发了相同的 Err.Number,但使用 Err.Description“方法 'Remove' of object 'IDictionary' failed”。

          似乎 Err.Description 在编译的程序中搞砸了,在这种情况下出于某种原因

          【讨论】:

            猜你喜欢
            • 2015-06-10
            • 1970-01-01
            • 2011-11-12
            • 2011-10-12
            • 2011-06-12
            相关资源
            最近更新 更多