最近在做一个比较大的系统。
由于本人是第一次做大项目,所以在程序设计时遇到了很多问题。现在大部分问题都解决了,但有一个很棘手的问题一直找不到原因,无法解决。
也不知道从什么时候开始,编译生成的 exe 程序运行时一切正常,就是退出程序时会产生“该程序由于执行非法操作,将被关闭。”的错误,而在 VB 的调试环境下,是无论如何也不会有这个错误的。就是说,调试时运行我编的程序退出时是不会有“非法操作”的,而一旦生成了 exe 文件,脱离了调试环境运行程序,程序退出时就会产生“非法操作”。而且在各个版本的操作系统下程序退出时的表现不一样,在 98 和 2003 下每次退出 100% 会产生“非法操作”,而在 2000 和 XP 下每次退出有 20% ~ 30% 的概率会产生“非法操作”,对这种问题我是想破了头也想不通。
程序中用到了一些 windows api、控件和一个 VC 编写的读写 USB 设备的 DLL:
api 有:advapi32.dll         用于读写注册表
        comctl32.dll         使程序在WinXP下实现XP风格
        winmm.dll            用于精确定时
        kernel32             读写 INI 文件
        shell32.dll          调用浏览文件夹对话框和打开超链接控件有:Trend.ocx            画折线图控件
        VsNetMenu.OCX        XP 风格菜单控件
        mscomm32.OCX
        comdlg32.OCX
        msflxgrd.OCX
        comctl32.OCX
        mscomctl.OCX
        comct232.OCX
        mscomct2.OCXUSB DLL 的功能除了读写 USB 数据之外没有其他作用。
程序通过对串口和 USB 的设备读入数据进行处理,组合成有效的数据然后写入数据库。
数据库是 ACCESS 格式,数据库访问方式是 DAO 方式。下面是退出程序:
If Askexit = 1 Then
   respond = MsgBox("您确实要退出吗?", vbYesNo + vbQuestion, "carinfo")
   If respond = vbNo Then
      Cancel = True
      Exit Sub
   End If
End If
Do While Not (Me.ActiveForm Is Nothing)
   Unload Me.ActiveForm
Loop
Close_DataBase            关闭数据库
If ON_Recieve Then Delay (0.3)
Timer1 = False
Timer2 = False
Timer3 = False
ReadDataEnd               关闭 USB DLL
MSComm1.CommPort = 1      释放 COM1
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.CommPort = 2      释放 COM2
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
Delay (0.5)
End非法操作产生的错误信息为:
CARINFO 在 00de:007abf40 的模块
 <未知> 中导致无效页错误。
Registers:
EAX=000019ef CS=017f EIP=007abf40 EFLGS=00010246
EBX=008dfbfa SS=0187 ESP=008dfba4 EBP=008dfbe0
ECX=c16c6740 DS=0187 ESI=008dfc2e FS=1bef
EDX=00017024 ES=0187 EDI=00020000 GS=0000
Bytes at CS:EIP:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Stack dump:
bff72317 00000000 00000000 008dfc02 cbfe1c2f 439b1c2f 0000166f 00000000 00020000 05680000 05680000 008dfe20 bff7186d 000019ef 00020000 008dfc34 请各位高手根据上面这些资料帮我分析一下产生错误的原因。
如解决问题给予 100 分。

解决方案 »

  1.   


    尽量不用“end”强制退出应用程序。不过,出现“非法操作”很多时候,重装一下VB再编译就没问题了。
      

  2.   

    进去之后什么也不操作,直接退出也会有问题吗?
    一般出现这种问题是因为出现VB无法捕捉到的错误所致,原因有几种,如下:1.调用API出现错误!!2.调用的控件内部有错误!!3.内存未清除干净,SET OBJECT = NOTHIGN4.退出时TIMER事件没有结束!!!!5.循环未结束,并且循环内部有DOEVENTS语句!!……
    ……
    ……
    ……还有多种情况,将你的窗口退出事件的代码分别进行删除,看是否会出错,这样可以找出出现错误的语句(类似解决硬件问题的替换法)~~~~~~~