vb6 - "Invalid Procedure Call or Argument",但仅在已编译或 P 代码 EXE 中

标签 vb6 runtime

我有一个 VB6 程序,我已经维护了十年了。程序中有一个名为“准备副本”的子例程,如下所示(已编辑以添加更改):

Public Sub PrepareCopy()

On Local Error GoTo PrepareCopyError

MsgBox "in modeldescription preparecopy"

Set CopiedShapes = New Collection

MsgBox "leaving preparecopy"
Exit Sub
PrepareCopyError:
    MsgBox Err.Description, , Err.Number
    Resume Next
End Sub

其中 CopiedShapes 作为 VB6 集合变暗。

该代码现在会抛出运行时错误 5——无效的过程调用或参数。从间隙调试代码来看,错误出现在 MsgBox "in modeldescription preparecopy"MsgBox "leavingpreparecopy" 行之间,并且On Error 代码路径永远不会执行。

清除错误 5 对话框后,然后将出现 MsgBox“离开准备复制” 对话框,之后程序关闭。

它在我的开发计算机和两台客户端计算机上的行为方式如下。

它只发生在运行时代码中,无论我编译它还是使用 P 代码,似乎都没有什么区别

我在这里要求的是猜测是什么导致了这种事情的发生。

最佳答案

Procmon 没有帮助。微软在问题发生时对系统进行了深入的分析。

他们发现了错误的 HRESULT 故障代码。 VB6 运行时深处的某些东西试图通过 IDispatch 接口(interface)访问后期绑定(bind)但未声明的对象。他们很快就安排了与我的通话。我询问哪个对象是通过 IDispatch 调用的;我的项目的 VB6 部分没有后期绑定(bind)调用。 (“选项显式”)

在电话中,他们让我离开。他们拒绝帮助确定进一步的根本原因,因为涉及 VB6 代码,并且支持部门被禁止解决 VB6 问题。我反驳说这显然是受支持的运行时的问题,但无济于事。

相反,我听了一场 20 分钟的讲座,内容是在无钱可赚的情况下支持某些事情的经济性。我回复了一个关于三次虚拟化应用程序的 war 故事,该应用程序在一家电话公司工作 35 年后仍在运行。

他们是好人;他们想帮助我解决问题,但他们的政策禁止这样做。今天我并没有比发布问题时更接近根本原因。

但是,如果您从 VB6 运行时调用 MsgBox,它会将 WM_USER 消息发送到项目中的其他 VB6 窗体。就我而言,这又触发了 MDIForm_Activate,其中包含以下代码:

Me.TreeView1.SetFocus

尽管事实上 TreeView1 根据定义已明确声明,但他们仍将其声明为后期绑定(bind) IDispatch 调用失败的原因,但始终拒绝解释这是怎么回事。电话里的人甚至说他绝对能弄清楚,但微软的政策禁止这样做,因为那是VB6。

删除 SetFocus 调用可以消除产生错误的情况。

关于vb6 - "Invalid Procedure Call or Argument",但仅在已编译或 P 代码 EXE 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572624/

相关文章:

c# - 如何在 .NET 库中读取从 VB6 IDE 传递的命令行参数?

vb6 - 如何在 Visual Basic 6 中使用滚动条?

string - VB6使用密码加密文本

c# - 在运行时动态修改样式(添加触发器)

c# - 在运行时在 Unity 中解析具有超过 65k 个顶点的网格

c++ - Visual Studio 6 提示和技巧

vb6 - 向 Crystal 报表传递参数

c# - 运行时和编译时有什么区别?

runtime - 在运行时生成 BPEL 的框架?

java - 在同步方法中将字符串存储在 ArrayList 中