程序有错误的时候,出现错误提示后,点停止程序,vb就退出了
程序原来不是这样的,后来不知是什么时候开始的,我的程序里如果有错误,比如变量未定义,数组溢出等问题的时候,vb会提示出错误的原因,然后点停止程序按钮,整个vb就退出了.很苦恼啊,有时候还没保存就点运行然后出问题后vb退出,白编了,而新建一个工程,就不会退出!高手帮忙解答一下 问题点数:10、回复次数:14Top
1 楼Summer006(脸都丢尽了!闭关修练。。。。)回复于 2005-12-30 17:43:35 得分 5
是否拦截了窗口的消息,用自己的过程处理消息?
是否用了api直接操控内存?
我只遇到过这2种直接退出的情况。
其他还有什么会导致,就不知道了
Top
2 楼fxj331072(白天与黑夜)回复于 2005-12-30 17:45:36 得分 0
on error goto next '如果错误继续运行
建议用if语句,或错误捕捉.Top
3 楼fengyin520(fy)回复于 2005-12-30 18:26:46 得分 0
最近在程序里新加了一个控制窗口到达一定尺寸时,拖动操作不管用的模块,没有用普通的方法处理,因为普通的方法会使窗口闪烁,难道是这个模块的原因?
'控制窗体最小限定的代码
'新建一个标准模块.
'代码如下
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const GWL_WNDPROC = (-4)
Public Const WM_GETMINMAXINFO = &H24
Type POINTAPI
x As Long
y As Long
End Type
Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Public preWinProc As Long
Public Function wndproc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lwd As Long, hwd As Long
If Msg = WM_GETMINMAXINFO Then
Dim maxmin As MINMAXINFO
CopyMemory maxmin, ByVal lParam, Len(maxmin)
'maxmin.ptMaxTrackSize.x = 1000 '设定最大Resize的宽度
'maxmin.ptMaxTrackSize.y = 800'设定最大Resize的高度
maxmin.ptMinTrackSize.x = 800 '设定最小Resize的宽度
maxmin.ptMinTrackSize.y = 600 '设定最小Resize的高度
CopyMemory ByVal lParam, maxmin, Len(maxmin)
Else
wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)
End If
End Function
Top
4 楼iangenius(奋斗中拥有)回复于 2005-12-30 18:40:10 得分 0
没碰到过,2楼的好象不信!!!Top
5 楼fengyin520(fy)回复于 2005-12-30 18:42:34 得分 0
然后在load 和unload 里有如下代码
Private Sub MDIForm_Load()
frmSplash.Show
DoEvents
Call MDIfrmMainInit
TimerMain.Enabled = True
Unload frmSplash
'控制窗体最小限定的代码
Dim ret As Long
preWinProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf wndproc)
'控制窗体最小限定的代码
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
TimerMain.Enabled = False
'控制窗体最小限定的代码
Dim ret As Long
ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, preWinProc)
'控制窗体最小限定的代码
End SubTop
6 楼fengyin520(fy)回复于 2005-12-30 18:53:09 得分 0
果然是这个限制窗口最小的模块惹的祸 ,我对这段代码不太懂 ,也是借用别人的模块,来实现自己的功能,哪位高手能看看这段代码为什么会使vb退出呢?Top
7 楼laidon(走进.NET,开创新生活)回复于 2005-12-30 22:50:07 得分 2
偶觉得楼主在没有查明原因前要设置在每次运行调试前自动保存程序,如二楼所说,一些api错误和内存溢出会导致ide崩溃Top
8 楼hank212(IT民工)回复于 2005-12-31 08:26:45 得分 0
on error goto nextTop
9 楼Summer006(脸都丢尽了!闭关修练。。。。)回复于 2005-12-31 09:40:53 得分 0
ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf wndproc)
你这就是拦截窗口消息自己处理嘛。就是这个导致的。
不信就把setwindowslong,getwindowslong三句注释掉,保准出错也不会直接退出ide了。
如果消息的制造者是自己的另一个程序,那倒可以把消息替换成不常用的事件,然后在事件里面写处理代码。这个方法我屡试不爽,环保又卫生。
但如果无法控制消息产生,比如要实现鼠标在非标题区也能拖动窗体,就没法了。Top
10 楼fengyin520(fy)回复于 2005-12-31 11:19:27 得分 0
这个代码就是使窗体拖小到一定程度就不能再小了,那怎么把他替换成不常用的事件,又怎样写处理代码:)Top
11 楼Summer006(脸都丢尽了!闭关修练。。。。)回复于 2005-12-31 12:14:33 得分 0
这个没办法,因为消息是windows产生的,修改不了.Top
12 楼fengyin520(fy)回复于 2005-12-31 12:20:55 得分 0
呵呵,谢谢啊,我现在是先把这断代码屏蔽掉,等程序正式出炉的时候加上:)Top
13 楼mysticboy(_๑۩۞۩๑۰•●|麦۞壳۞饼|●•۰๑۩۞۩๑_)回复于 2005-12-31 12:22:17 得分 3
回调 从来都是这样。难调试就在这里。
我从来都是设置VB在每次运行前保存。
这样即使死掉了也不会丢代码哦!
哈哈!楼猪一定要记得在选项里设置这个。
别告诉我你不知道在那设置!Top
14 楼sqfeiyu(流星雨)回复于 2005-12-31 14:22:11 得分 0
不要亂用API﹐都是API惹得禍~~Top




