背景:我使用的是vb6.0,花几个月时间编写了一个数据处理软件,为了批量处理工作中遇到的数据,目前有一万两千行的代码
事件:编到后期的时候出现了一个问题,每次运行程序,一旦报错进入调试状态,不能点“终止”,一点“终止”vb6编辑器软件立即闪退,
vb6的软件应该没问题,因为其它代码在调试状态下终止都不会导致编辑器闪退
求助:哪些代码会导致调试状态下点击终止vb6.0出现闪退,请教有经验的师傅,帮忙分析一下,先谢谢了!

解决方案 »

  1.   

    最常见的是某些HOOK(或“子类化”),
    在“停止”之前必须有相应的UnHook 。
    否则就会引起崩溃。
      

  2.   

    按你说的是“数据处理”,一般不会有HOOK之类的东西吧,理论上是可以“随时停止”的。你是不是用了某个“界面美化”的库或dll之类的?
    如果有的话,多半都是在“启动”时,要调用它的Attach、Bind之类的接口;
      而在结束运行之前,则必须调用相应的detach等相关接口解除功能。
      

  3.   

    用分段记录日志的方式,逐步定位问题位置。
    十有八九就是外部调用DLL导致的,传入的指针不对或者没有关闭对象啥的导致的。
      

  4.   

    谢谢您的解答,确实是调用了一个“界面美化”的库,想请教您该如何解决,可否提供些语句参考,先谢谢了我程序里的语句是:
    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
      

  5.   

    不是给你说过了吗!!!!
    在停止前,要调用它的 “Detach”接口啊!
    在“调试”模式下,代码中断时,是可以在“立即窗口”中执行命令的,包括API调用。
    你只要在点“停止”之前,在立即窗口中执行: call SkinH_Detach
      或者执行: Call SkinH_DetachEx(相关的窗口.hWnd)注意一下:
      这些界面美化的库,我从来没接触过,你自己试验一下:
      调用 SkinH_Detach是否为“解除所有窗口的关联”,如果是,就调用这个好了。
      如果不是,那应该需要调用SkinH_DetachEx ;
      这时就要注意,在“当前运行状态”下,你已经“Attach”了哪些窗口,就需要分别DetachEx哪些窗口。在把已经加载并Attach的窗口都DetachEx之后, 再点“停止”按钮,应该就可以了。
      

  6.   

    使用了call SkinH_Detach,所有窗口(5个form,无其他)的皮肤都瞬间没了,终止,闪退
    使用Call SkinH_DetachEx(相关的窗口.hWnd)处理每个form,所有窗口的皮肤都没了,终止,闪退
    还有其他方法么,(依然感谢你教的这个方法,又学习了点东西)
      

  7.   

    在Detach之后,相关窗口的皮肤肯定没了,这个又没影响。
    正常情况下,都是在“结束程序”之前进行这些处理,那是“眨眼间完成”的事,基本不会有“不良影响”。你这个“工程”,是你自己写的吗?
    我感觉在“Detach”之后,直接终止程序,也应该不会影响到IDE了啊,怎么还会有“闪退”的事……
    那么:你的程序,如果是“正常结束”,要进行些什么处理呢?
      你注意在“停止”之前,把其它的“必要的清理工作”做一下,然后再“停止”啊。
      

  8.   

    问题肯定是出现在“界面美化”的库上,如果使用窗口子类化方法,一般调试都会闪退,你可以在出问题需要调试的语句前加入UnhookXXX(你自己的解除子类化的函数),这样,调试就不会闪退