我有一个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
似乎没有区别我在这里要求的是关于是什么导致这种事情发生的猜测。
答案 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
。
您可以尝试删除声明中的new
吗?
当旧的Collection与其内容一起被垃圾收集时,集合中是否有一个Sub Class_Terminate()
被调用的实例?
答案 2 :(得分:0)
错误是否仅发生在与编译代码的机器不同的机器上?可能是运行时环境中缺少某些DLL(如MSVBRT.dll等) 最简单的解决方法:在构建机器上运行。
如果在那里没有发生,你可以通过VB6创建一个可部署的版本(安装程序),其中包括所需的全部内容。或者,使用SysInternals' Procmon在运行过程中监视进程,并查看在错误发生时它尝试访问的资源(文件,DLL,reg密钥)。