2011-06-15 64 views
3

我有一個遺留的vb6應用程序在退出時崩潰 - 無論是作爲可執行文件還是在IDE中。我怎樣才能避免碰撞?退出VB 6崩潰

  • 我目前卸載形式(除了frmmain)在form_unload,釋放所有的ADODB記錄集,將所有的boundcollections =什麼都沒有。
  • 我試圖在form_terminate事件中發現SetErrorMode SEM_NOGPFAULTERRORBOX,但這並未阻止發生錯誤。
  • 我也檢查了在我的代碼中實例化的子類,發現沒有。
  • 我檢查了使用的外部組件 - 它們是ComponentOne FlexGrid 8拼寫8和ComponentOne sizer控件。廣泛的網絡和論壇搜索沒有發現任何類似於我的這些控件的已知問題。

如果我在實際做任何事情之前關閉程序,似乎不會出現此問題。然而,加載綁定控件似乎是靠近問題根源的地方,儘管重複地使用調試器,似乎問題的開始「移動」了。編程式退出,「X」和IDE「結束」控制出現問題 錯誤消息是 The instruction at "0x77d042b8" referenced memory at "0x055c9028". The memory could not be "Read"。在錯誤框的標題是從我的應用程序 內的工具提示(在不同的時間不同)逐步執行代碼時,我已經把遊 - 在Form_Unload事件上退出子線的應用程序崩潰

ADDED
我意識到,我應該包括一些其他信息與我原來的職位。當我做到這一點時,我非常疲倦和沮喪,對不起,這很難閱讀。 1)我確實安裝了最新的服務包(6),並且組件的最新版本爲
2)在我的VS2010 IDE(它位於同一臺服務器上)中進行調試時,我得到了很長的時間以OLEAUT32.dll開頭的堆棧轉儲,我更新了該DLL,但沒有發現變化
3)我實際上是通過遠程桌面連接運行(並正在運行)該程序。該程序在我的桌面以及用戶終端服務器連接上崩潰。
4)我下運行的操作系統是Windows Server 2003的
5)我運行的代碼是

Private Sub Form_Unload(Cancel As Integer) 
     Set rsChild = Nothing 
     Set rsCaseFile = Nothing 
     ' many similar record sets closing 
     ys.CloseConnection 
     Set ys = Nothing 
     UnloadAllForms (Me.Name) 
     ' closeing bound collections 
     Set bndChild = Nothing 
     Set bndAuth = Nothing 
     ' more bound collections closed 
     ' i had added the next two lines but it made no difference 
     frmmain.close 
     Set frmMain = nothing 
     getout 
    end sub 
    Public Sub UnloadAllForms(Optional FormToIgnore As String = "") 
     Dim f As Form 
     For Each f In Forms 
      If Not f Is Nothing Then 
       If f.Name <> FormToIgnore Then 
        Unload f 
        Set f = Nothing 
       End If 
      End If 
     Next f 
    End Sub 

'\code' 

6)我已經加入的「getout」例行「代碼」的啓動希望模塊能夠讓表單對象乾淨地關閉這並沒有解決問題
非常感謝大家的幫助

+0

你可以發佈你關閉時運行的代碼嗎? – jac 2011-06-15 20:09:00

+0

哇,這是一個段落中的大量密集文本供人閱讀和理解免費...在格式化文本可讀的一些努力可能是爲了 – 2011-06-15 20:15:03

+0

@ p.campbell問題是在那裏的第一個句子「我的vb6應用程序在退出時崩潰 - 既作爲可執行文件又作爲IDE使用。」這意味着「我怎樣才能避免崩潰」! @Jarrod這是一個措詞良好的問題,只需要一些格式。我會編輯它。如果你自己編輯它,將來它可能對noobie更友好? @關閉選民和downvoters。沒有冒犯,但**你怎麼了**?這是一個明確的問題。這很長,但那是因爲IronHead在研究這個問題上做了很好的工作。這不是「太本地化」。對問題+1,我將投票重新打開,如果它關閉。 – MarkJ 2011-06-16 11:58:04

回答

0

發生了什麼是有一些背景工作正在進行。最有可能的是,某個進程觸發了異步代碼,該進程在發出close()後由事件處理程序處理。避免方法是隱藏表單,然後在結束close方法之前等待一下。爲了解決這個問題,你必須確定什麼是在後臺線程上工作。在經典的VB中,這可能最終會讓人痛苦。

+0

你會如何建議我'停止'讓它關閉。我會想,如果我做了一些像打電話的計時器,可以保持表格的開放性。我可以打電話給一個計時器,然後以某種方式放置一個me.hide語句嗎?感謝您對我的看法 – IronHead83 2011-06-17 13:10:38

0

令人討厭的情況。

  • 您最新的Windows服務包,VB SP6和latest builds of the components
  • 問題是否發生在其他機器上,還是僅僅是您的機器?如果它只是你的機器 - 購買另一臺機器。
  • 嘗試通過移除程序片段來追蹤它,直到它停止崩潰。然後放回部分,直到它崩潰。這應該有助於您追蹤哪些組件或代碼涉及。程序是否正常工作並不重要,只需知道它是否在退出時崩潰。你可以註釋掉或刪除整個類,刪除控件,任何東西。
+0

MarkJ非常感謝您的重新格式化和我的道歉,我一直在研究該代碼很久,甚至沒有意識到我的寫作很混亂。 – IronHead83 2011-06-16 13:03:43

+0

@IronHead不用擔心。這並不令人困惑,但有一點額外的格式可以幫助讀者 – MarkJ 2011-06-16 13:20:57

3

看來,這個錯誤是死,殺在10份
1)非常仔細地處置確認之前它被設置爲無每個記錄被關閉所有對象
2)的
3)從最後的形式封閉每個形式關閉事件
4)設置的最後一個表格。可見=假,則稱爲定時器1秒鐘
5)加入一個getout呼叫的最後形式的底部卸載事件
6)放7)廣告模塊
DED

'code' 
Private Declare Function SetErrorMode Lib "kernel32" (_ 
    ByVal wMode As Long) As Long 
Private Const SEM_FAILCRITICALERRORS = &H1 
Private Const SEM_NOGPFAULTERRORBOX = &H2 
Private Const SEM_NOOPENFILEERRORBOX = &H8000& 
'code' 

到模塊
8)在聲明呼籲在getout子
9開始與

'code' 
SetErrorMode SEM_NOGPFAULTERRORBOX 
'code' 

該聲明)證實,最後開放的形式被關閉
10)將此代碼包含在getout子的底部以確保它可以關閉

'code' 
    Dim tstart As Date 
    tstart = TimeValue(Now()) 
    Dim i As Integer 
    i = 0 
    Do While (DateAdd("s", 3, tstart)) > TimeValue(Now()) 
     For i = 0 To 1000 
      i = i + 1 
     Next 
     i = 0 
    Loop 
    ' endtask("PLacements") 

    End 
'code' 

最後一部分相當於將木樁放入心臟
非常感謝大家給我的幫助,特別是MarkJ爲我提交的論壇標準提交的原始文檔 - 我會盡力在支付時支付費用我可以

+0

謝謝你回答你自己的問題。第7步和第8步解決了我的問題,我試着像你一樣清理所有的清理工作,但是在退出時抑制窗口錯誤是唯一有幫助的。 – 2015-03-06 21:54:59