“无效的过程调用或参数”,但仅限于已编译或P-Code EXE

时间:2010-04-03 20:48:43

标签: vb6 runtime

我有一个VB6程序,我已经维护了十年。程序中有一个名为“Prepare Copy”的子程序,看起来像这样(编辑添加更改):

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 "leaving preparecopy"行之间出现,并且On Error代码路径永远不会执行。

清除错误5对话框后,然后会出现MsgBox "leaving preparecopy"对话框,然后程序关闭。

它在我的开发机器和两台客户端计算机上都是这样的。

它只发生在运行时代码中,并且无论是编译它还是使用P-Code

似乎没有区别

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

3 个答案:

答案 0 :(得分:3)

Procmon没用。微软在问题出现时对系统进行了深入研究。

他们发现了一个糟糕的HRESULT故障代码。 VB6运行时中的某些东西试图通过IDispatch接口访问后期绑定但未声明的对象。他们迅速安排了我的电话。我问通过IDispatch调用哪个对象;在我的项目的VB6部分没有后期调用。 (“选项明确”)

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

相反,在没有钱的情况下,我得到了20分钟的关于支持某事的经济的讲座。我回复了一个战争故事,讲述了一家电话公司35年后仍然运行的三次虚拟化应用程序。

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

但是,如果从VB6运行时调用MsgBox,它会向项目中的其他VB6表单发送WM_USER个消息。反过来,在我的情况下,触发了MDIForm_Activate,其中包含此代码:

Me.TreeView1.SetFocus

而且,尽管TreeView1按照定义明确声明,但是他们声称是后期绑定IDispatch调用失败的原因,他一直拒绝解释这可能是什么。手机上的那个人甚至说他绝对可以搞清楚,但微软的政策禁止它,因为那是VB6,那里。

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

答案 1 :(得分:2)

您最近的评论说该变量为Public CopiedShapes as New Collection

  1. 您可以尝试删除声明中的new吗?

  2. 当旧的Collection与其内容一起被垃圾收集时,集合中是否有一个Sub Class_Terminate()被调用的实例?

答案 2 :(得分:0)

错误是否仅发生在与编译代码的机器不同的机器上?可能是运行时环境中缺少某些DLL(如MSVBRT.dll等) 最简单的解决方法:在构建机器上运行。

如果在那里没有发生,你可以通过VB6创建一个可部署的版本(安装程序),其中包括所需的全部内容。或者,使用SysInternals' Procmon在运行过程中监视进程,并查看在错误发生时它尝试访问的资源(文件,DLL,reg密钥)。