我有一个 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/