背景:我使用的是vb6.0,花幾個月時間撰寫了一個資料處理軟體,為了批量處理作業中遇到的資料,目前有一萬兩千行的代碼
事件:編到后期的時候出現了一個問題,每次運行程式,一旦報錯進入除錯狀態,不能點“終止”,一點“終止”vb6編輯器軟體立即閃退,
vb6的軟體應該沒問題,因為其它代碼在除錯狀態下終止都不會導致編輯器閃退
求助:哪些代碼會導致除錯狀態下點擊終止vb6.0出現閃退,請教有經驗的師傅,幫忙分析一下,先謝謝了!
uj5u.com熱心網友回復:
最常見的是某些HOOK(或“子類化”),在“停止”之前必須有相應的UnHook 。
否則就會引起崩潰。
uj5u.com熱心網友回復:
按你說的是“資料處理”,一般不會有HOOK之類的東西吧,理論上是可以“隨時停止”的。你是不是用了某個“界面美化”的庫或dll之類的?
如果有的話,多半都是在“啟動”時,要呼叫它的Attach、Bind之類的介面;
而在結束運行之前,則必須呼叫相應的detach等相關介面解除功能。
uj5u.com熱心網友回復:
用分段記錄日志的方式,逐步定位問題位置。十有八九就是外部呼叫DLL導致的,傳入的指標不對或者沒有關閉物件啥的導致的。
uj5u.com熱心網友回復:
謝謝您的解答,確實是呼叫了一個“界面美化”的庫,想請教您該如何解決,可否提供些陳述句參考,先謝謝了
我程式里的陳述句是:
Private Sub Form_Load()
'調整引數(255即不透明,陰影深度80,銳度10即邊緣清晰程度,陰影大小5,0,0,0,0,0)
SkinH_AttachEx "C:\Windows\homestead.she", ""
SkinH_SetAero (1)
SkinH_AdjustAero 255, 80, 10, 5, 0, 0, 0, 0, 0
End Sub
宣告如下:
Public Declare Function SkinH_AttachEx Lib "SkinH_VB6.dll" (ByVal lpSkinFile As String, ByVal lpPasswd As String) As Long
Public Declare Function SkinH_Attach Lib "SkinH_VB6.dll" () As Long
Public Declare Function SkinH_AttachExt Lib "SkinH_VB6.dll" (ByVal lpSkinFile As String, ByVal lpPasswd As String, ByVal nHue As Integer, ByVal nSat As Integer, ByVal nBri As Integer) As Long
Public Declare Function SkinH_AttachRes Lib "SkinH_VB6.dll" (lpRes As Any, ByVal nSize As Long, ByVal lpPasswd As String, ByVal nHue As Integer, ByVal nSat As Integer, ByVal nBri As Integer) As Long
Public Declare Function SkinH_AdjustHSV Lib "SkinH_VB6.dll" (ByVal nHue As Integer, ByVal nSat As Integer, ByVal nBri As Integer) As Long
Public Declare Function SkinH_Detach Lib "SkinH_VB6.dll" () As Long
Public Declare Function SkinH_DetachEx Lib "SkinH_VB6.dll" (ByVal hwnd As Long) As Long
Public Declare Function SkinH_SetAero Lib "SkinH_VB6.dll" (ByVal hwnd As Long) As Long
Public Declare Function SkinH_SetWindowAlpha Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal nAlpha As Integer) As Long
Public Declare Function SkinH_SetMenuAlpha Lib "SkinH_VB6.dll" (ByVal nAlpha As Integer) As Long
Public Declare Function SkinH_GetColor Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal nPosX As Integer, ByVal nPosY As Integer) As Long
Public Declare Function SkinH_Map Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal nType As Integer) As Long
Public Declare Function SkinH_LockUpdate Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal nLocked As Integer) As Long
Public Declare Function SkinH_SetBackColor Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal nRed As Integer, ByVal nGreen As Integer, ByVal nBlue As Integer) As Long
Public Declare Function SkinH_SetForeColor Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal nRed As Integer, ByVal nGreen As Integer, ByVal nBlue As Integer) As Long
Public Declare Function SkinH_SetWindowMovable Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal bMove As Integer) As Long
Public Declare Function SkinH_AdjustAero Lib "SkinH_VB6.dll" (ByVal nAlpha As Integer, ByVal nShwDark As Integer, ByVal nShwSharp As Integer, ByVal nShwSize As Integer, ByVal nX As Integer, ByVal nY As Integer, ByVal nRed As Integer, ByVal nGreen As Integer, ByVal nBlue As Integer) As Long
Public Declare Function SkinH_NineBlt Lib "SkinH_VB6.dll" (ByVal hDtDC As Long, ByVal left As Integer, ByVal top As Integer, ByVal right As Integer, ByVal bottom As Integer, ByVal nMRect As Integer) As Long
Public Declare Function SkinH_SetTitleMenuBar Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal bEnable As Integer, ByVal nMenuY As Integer, ByVal nTopOffs As Integer, ByVal nRightOffs As Integer) As Long
Public Declare Function SkinH_SetFont Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal hFont As Long) As Long
Public Declare Function SkinH_SetFontEx Lib "SkinH_VB6.dll" (ByVal hwnd As Long, ByVal szFace As String, ByVal nHeight As Integer, ByVal nWidth As Integer, ByVal nWeight As Integer, ByVal nItalic As Integer, ByVal nUnderline As Integer, ByVal nStrikeOut As Integer) As Long
Public Declare Function SkinH_VerifySign Lib "SkinH_VB6.dll" () As Long
uj5u.com熱心網友回復:
謝謝您的解答,可否提供下例句,沒接觸過這些,一團霧水,謝謝你
uj5u.com熱心網友回復:
不是給你說過了嗎!!!!在停止前,要呼叫它的 “Detach”介面啊!

在“除錯”模式下,代碼中斷時,是可以在“立即視窗”中執行命令的,包括API呼叫。
你只要在點“停止”之前,在立即視窗中執行: call SkinH_Detach
或者執行: Call SkinH_DetachEx(相關的視窗.hWnd)
注意一下:
這些界面美化的庫,我從來沒接觸過,你自己試驗一下:
呼叫 SkinH_Detach是否為“解除所有視窗的關聯”,如果是,就呼叫這個好了。
如果不是,那應該需要呼叫SkinH_DetachEx ;
這時就要注意,在“當前運行狀態”下,你已經“Attach”了哪些視窗,就需要分別DetachEx哪些視窗。
在把已經加載并Attach的視窗都DetachEx之后, 再點“停止”按鈕,應該就可以了。
uj5u.com熱心網友回復:
使用了call SkinH_Detach,所有視窗(5個form,無其他)的皮膚都瞬間沒了,終止,閃退
使用Call SkinH_DetachEx(相關的視窗.hWnd)處理每個form,所有視窗的皮膚都沒了,終止,閃退
還有其他方法么,(依然感謝你教的這個方法,又學習了點東西)
uj5u.com熱心網友回復:
在Detach之后,相關視窗的皮膚肯定沒了,這個又沒影響。正常情況下,都是在“結束程式”之前進行這些處理,那是“眨眼間完成”的事,基本不會有“不良影響”。
你這個“工程”,是你自己寫的嗎?
我感覺在“Detach”之后,直接終止程式,也應該不會影響到IDE了啊,怎么還會有“閃退”的事……
那么:你的程式,如果是“正常結束”,要進行些什么處理呢?
你注意在“停止”之前,把其它的“必要的清理作業”做一下,然后再“停止”啊。
uj5u.com熱心網友回復:
問題肯定是出現在“界面美化”的庫上,如果使用視窗子類化方法,一般除錯都會閃退,你可以在出問題需要除錯的陳述句前加入UnhookXXX(你自己的解除子類化的函式),這樣,除錯就不會閃退uj5u.com熱心網友回復:
不添加皮膚,美化,把自己得程式做好。然后添加美化
沒試過,不知道結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/40414.html
標籤:VB基礎類
