虽然vb有错误处理语句,但是程序中往往会发生一些难以预料的错误。
比如程序a发生了错误,弹出了一个错误对话框,这时如果人工关闭这个对话框的话程序a肯定会退出。那么如何不用人工干预,用程序b如何能检测到a已发生错误呢?又如何这个出错的程序a关闭并重新运行呢?
比如程序a发生了错误,弹出了一个错误对话框,这时如果人工关闭这个对话框的话程序a肯定会退出。那么如何不用人工干预,用程序b如何能检测到a已发生错误呢?又如何这个出错的程序a关闭并重新运行呢?
解决方案 »
- 送分100分:关于MAX的使用问题
- vb:学习vba需要先精通vb吗?
- 如果一个自定义的app.dll中的函数有两个参数如a(int x,int y)如何在VB中来调呢?
- 我用VB连接开放web服务80端口无反应?[求助]
- 请高手解释2种连接MDB的区别?
- 请问:怎样实现一个层次性的查询
- 既有图片又有文字的按钮
- VisualBasic6.0(SP5)中F5和F8的问题
- 如何改变windows 自带的 HeaderControl 和 ScrollBar 的背景色
- 怎样实现这样一个文本框,如 姓名:_______ ?
- 我朋友的毕业设计是工资管理系统,用vb6+sql server做!,谁能提供一份工资管理程序的源代码啊?谢谢啦!
- DATAGRID中如何回车下移到下一格?急急急!!!
on error goto ErrExitErrExit:
shell "自己"
End
end sub
on error goto ErrExit
...
Exit sub
ErrExit:
shell "自己"
End
end sub
Private Declare Function SetUnhandledExceptionFilter _
Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) _
As LongPrivate Type EXCEPTION_POINTERS
pExceptionRecord As Long
ContextRecord As Long
End Type
'新的异常处理函数
Public Function NewExceptionHandler( _
ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long
End Function---------------------------------------------------------------
函数的用法可以参考我的blog上的一篇文章:
http://blog.csdn.net/qiqi5521
取硬盘物理序列号的完整代码
你可以试一下,在一个标准模块中定义一个替代全局异常处理函数的普通VB函数,定义如下:'新的异常处理函数
Public Function NewExceptionHandler( _
ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long
msgbox "截获了系统异常"
End Function
然后在form_load事件中,写如下代码:SetUnhandledExceptionFilter addressof NewExceptionHandlerform_unload中写如下代码:
SetUnhandledExceptionFilter 0&接下来运行程序,就可以截获系统异常了。
我把全部代码发上来,你可以参考一下。module1.bas----------------------------------------------------------------
Option Explicit'替换系统的默认错误处理程序的函数。
Public Declare Function SetUnhandledExceptionFilter _
Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) _
As Long
Private Type EXCEPTION_POINTERS
pExceptionRecord As Long
ContextRecord As Long
End Type'新的异常处理函数
Public Function NewExceptionHandler( _
ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long
MsgBox "截获了系统异常!"
End Function--------------------------------------------------------------------------
form1.frm-----------------------------------------------------------------
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Sub Command1_Click()
CopyMemory ByVal 0&, 8&, 4
End SubPrivate Sub Form_Load()
SetUnhandledExceptionFilter AddressOf NewExceptionHandlerEnd SubPrivate Sub Form_Unload(Cancel As Integer)
SetUnhandledExceptionFilter 0&
End Sub--------------------------------------------------------------------------