现在的位置: 首页 > 综合 > 正文

致命错误:异常代码=C0000005(这篇最详细,收藏之~)

2018年07月08日 ⁄ 综合 ⁄ 共 2612字 ⁄ 字号 评论关闭

,输入“联通”,然后保存后关闭该文本,再重新开打,看到什么了?

    是的,当年WIN2000操作系统的流行时,Visual Foxpro开发组并没有彻底改正语义分析器代码的漏洞。


    好的,第一大类我就阐述完了。如何避免它呢?
    总的应该说很麻烦,有两种途径供您选择:1、修改VCX、SCX表国际代码页的编码,将简体中文编码改为英文编码;
    2、我所推荐的方法是尽量用prg。你可能会认为这样做很麻烦,但作为程序员,您应该更加专业一些。您可以备份可视化的表单或类文件,但在程序正式发布前,最好最大限度地转化为prg程序。倘若以后需要修改程序,通过备份的表单或类文件进行可视化编辑,然后再次转化为prg发布之。


顺便告诉您一个小窍门:

    在IDE设计模式下,我们或许会突然遇到“致命错误-C0000005”袭击,因为表单是以独占的、开放式自由表缓冲的模式交互的,所以此前未经保存的信息都将被丢失,这您是知道的,通过刚才的讲述,您还知道了这或许会面临表被损坏的风险,从而进入了一个“致命错误-C0000005”潜在引发今后“致命错误-C0000005”故障的恶性循环。

    小窍门就是,您千万不要条件反射地去触击那个“确定”按钮!那不过只是Visual Foxpro系统所捕获的异常罢了,它不是真“致命”的,Visual Foxpro系统仍在运转中,也就是说,它还在正常地接收着Windows操作系统不断发送来的消息。这时,请您点开Windows桌面最左下角的“开始”按钮,选择“重新启动计算机”或“关闭计算机”,Windows在试图关闭电脑前,会先检查是否有尚在运行中的应用程序,它会发现一个叫Fox的先生尚未退场,于是便发送清场的消息给Foxpro,Visual
Foxpro其实还在正常的运转中,它接收到这条消息后,会调用自身的退出机制试图退出,而自身的退出机制会发现尚有正在编辑的表单,便会发出“需要保存修改吗?”的询问消息,这时候,您选择保存,就可以了!

千万注意了!这段过程大概只有5秒钟的时间!因为为了防止死循环的情况出现,Windows会在等待几秒钟对方不应答的情况下强行终止程序,那时候,就真正退出整个Windows系统了。所以您一定要眼疾手快!


    (说到异常处理,便自然地想到了Vfp9新加的异常处理Try机制,事实上倘若不是开发OLE远程服务的DLL,您就没有必要就使用它。因为VFP为您提供的On error或Error事件,其脚本解释程序代码实质上就是C++的异常处理机制,在您熟练地使用VFP错误处理程序时,实际上就等于在使用C++的异常处理程序了。)


    第二大类是第三方监控性质的软件。如:防毒软件在内存即时监控状态下、词霸软件在全屏拾取模式下等。其实防毒软件本身并不与VFP产生冲突,但有一个例外,就是内存即时监控(请注意:防毒有许多即时监控,唯有内存即时监控才会与有时候与VFP发生冲突)。

    所谓内存即时监控并不是去读取内存条中的数据,谁也没这么大的本事,它的原理就是专门关注于Windows系统目录下的system32子目录中的程序文件在运行中的状态。

    我们知道,在Visual Foxpro 8.0 版本以前,其运行时刻文件是安装在system32目录中的;而向最终客户发布你的应用程序时,默认情况下,无论是VFP什么版本,其运行时刻文件均会被拷贝到system32目录中去。

    防毒软件的内存即时监控的工作原理是这样的(这是瑞星公司首创的,瑞星软件也是狐友受害最深的):1、它会在Windows后台运行一个类似于Windows的模拟机(这有点像任天堂游戏模拟机和一些手机模拟机,还有现在时髦的Linux下的Windows模拟机);2、它运行一个循环,挨个监视system32目录下的exe及dll文件是否被调用;3、倘若被调用,就拷贝一份到瑞星自己创建的隐含、系统目录中去,然后在那个模拟机中运行之,以便模拟其在Windows实际运行中的状态;4、在模拟运行中,看它是否有病毒发作的特征;5、如果有,就查找病毒特征码数据库;6、若在数据库中,找到了对应的特征码,便确定特征码所对应的病毒名称,否则,就按未知名的新病毒处理(这就是为什么有的VFP加密软件会被防毒软件误报病毒)。

    由于VFP应用程序与运行时刻DLL库交互的太频繁了,使防毒软件的那个循环程序不断捕捉到VFP运行时刻库在进行新的数据响应,防毒软件便不断地试图拷贝它,以便进行新一轮的模拟。但你知道,无论是DBF还是SCX等等,只要是独占方式打开的(SCX与VCX总是被独占的,而DBF取决于你的设计),就不能被其它的程序所访问。但在Windows操作系统中,防毒软件所调用拷贝程序的系统优先级要高于你的程序的优先级,所以你的VFP程序会最终产生致命错误。


    如何避免它呢?你可以简单地关闭防毒软件,但如果让客户也像你这样做的话,就显得太不专业了!

    聪明的你恐怕现在已经想到了:只要在发布你的应用程序时,将那些运行时刻库放到应用程序目录下就可以了!


    同样,词霸软件本身也不会与你的程序发生冲动,只是在全屏取词的模式下才会如此。不过你的用户几乎不会遇到,因为你的程序几乎不会让他们在程序界面状态下直接打开某个数据表——仅在词霸的全屏取词程序试图通过独占模式下的数据表的窗口句柄,来访问里面的文本属性时,才会与其独占模式发生冲突。


    第三大类是Visual Foxpro 自身的代码漏洞。比如VFP6.0版本的Textbox控件等等。现在版本的VFP,这样的错误少多了,我们的话题就不再展开。


    第四大类是硬件因素。
有些细节问题是最不被人所注意的。但其足以铸成大过。

    “致命错误C0000005”是内存泄漏的症状,而不仅仅是内存溢出,还有一个原因就是申请到的堆栈意外不足。

    在用电高峰期(例如夏季、或晚间的黄金时段),电压的突然不稳定,或许会非常微小,不至于迫使计算机意外重启,但或许会导致VFP系统在通过Windows消息机制向内存体申请堆栈时,得到Windows意外的反馈。

    除了说服您的客户使用UPS外,您应该检查用电的负荷情况,比如检查打印机或台灯是否与计算机电源线一起接在一个多功能插座上,应该尽量避免这样,一些老式的打印机,在打印作业时会消耗很大的电流。

抱歉!评论已关闭.