应用程序终止后,VB6 IDE崩溃

Dav*_*Caz 0 ide vb6

我团队中的几位开发人员遇到了这个问题 我们可以在IDE中运行我们的应用程序,但是当我们最终退出应用程序时,IDE本身将崩溃.

崩溃采取的形式

"Visual Basic已停止工作"

在此输入图像描述

如果我们很好地退出我们的应用程序或在调试器中强制停止它并不重要; 相同的结果(崩溃的IDE).


该应用程序的退出顺序是:

  1. 用户从菜单中选择"退出"

  2. 菜单事件处理程序调用 Unload Me

  3. Form_QueryUnload 事件处理程序触发

  4. Form_Unload事件处理程序触发.它确实:

 

'close all sub forms
For i = Forms.Count - 1 To 1 Step -1
    Unload Forms(i)
Next
Run Code Online (Sandbox Code Playgroud)

然后保存一些数据,然后Exit Sub.


我们倾向于运行一个包含5-6个项目的组文件.

这个错误有时似乎会消失,有时会发生,似乎是随机的.我不知道是什么因素影响了这一点.

如果我们实际上没有运行应用程序,只有IDE,那么它工作正常,我们可以通常IDE本身.

有人见过这个吗?有任何想法吗?谢谢!

wqw*_*wqw 6

这绝对是由子类化/挂钩中涉及的VB6对象的泄漏引起的,而不仅仅是这些.

我们为摆脱这些崩溃而采取的措施是对所有类(包括表单,用户控件,设计器和任何可以实例化的类)进行检测,DebugInstanceInitDebugInstanceTerm调用各自的Class/Form/UserControl InitializeTerminate事件.

Public Sub DebugInstanceInit(sModuleName As String, sDebugID As String, oObj As Object)

Public Sub DebugInstanceTerm(sModuleName As String, sDebugID As String)
Run Code Online (Sandbox Code Playgroud)

这些基本上可以随时跟踪应用程序使用的实例数量和类型.每个实例都分配一个唯一sDebugIDDebugInstanceInit被用作一个关键DebugIDs的收集.此集合在空中实例化Sub Main,当应用程序终止时(即在主窗体中Form_Unload),此集合必须为空或具有固定数量的实例(例如恰好为4),否则其内容是我们泄漏的对象类型.

修复IDE崩溃的原因是什么?

请注意,集合实例化为迟到,Sub Main这意味着它必须保留Nothing在设计时.我们DebugInstanceInit就像这样简单地办理入住手续

    If DebugIDs Is Nothing Then
        If Left$(sModuleName, 3) <> "ctx" Then
            DebugPrint "DebugInstanceInit", "mdErrorHandling", sDebugID & " " & LIB_NAME & "." & sModuleName & "." & FUNC_NAME_INITIALIZE & " (This should not happen)"
        End If
    Else
       ...
    End If
Run Code Online (Sandbox Code Playgroud)

基本上,除了在表单上放置的原始UserControl之外,其他任何东西都不会在设计时被实例化.这包括GlobalMultiUse对象,这包括UC属性正在访问的任何内容,因为UC属性是一种在设计时可访问的例程.

因此,我们不得不大量使用这样的Ambient.UserMode支票来填充UC的大部分代码

    If Ambient.UserMode Then
        Set .Picture = LoadStdPicture(ucsPicHelp)
    End If
Run Code Online (Sandbox Code Playgroud)

事实证明,我们的LoadStdPicture全局功能正在实例化一些cDibSections.好的一点是,一旦你在(This should not happen)调试打印语句中设置了一个断点,调用栈就会向你显示违规UC的确切属性.