在本文中,您将了解如下知识:
1、“致命错误c0000005”是什么东西?
2、它在什么情况下会发生?
3、如何避免其发生?
----------------------------------------------
“致命错误c0000005”是什么东西?
在VFP6以上版本的错误处理机中,它有了识别异常的能力,它以变量“致命错误”来取代“异常”——这一操作系统的专用术语。
让我们先来学习一下预备知识:什么叫异常。
异常,是操作系统领域的一个专用术语,系统异常区别于系统中断,前者是直接由运行程序的执行所产生的情况。如下情况都会造成系统异常:内存访问侵犯、整数被零除、整数溢出、内存泄漏、浮点异常等。
如果您不认识c0000005,那么您一定认识它臭名昭著的“父亲”——在WIN95下发生的“致命错误:非法操作,系统已无法继续运行,请与软件供应商联系!”的消息。如果当时您的PC上装了VC或DELPHI,您便可以按下该信息框的“调试”按钮,接下来便会发现其向您展示的错误地址,通常情况下,起始地址往往是c0000005段,因为WINDOWS的结构化异常处理机驻留在那里。
这在当时泛滥一时,曾有人专门为此而编了个恶意笑话,用e-Mail的形式直接发给比尔.盖茨,具体的笑话内容我忘了,因为时间太久了。据说比尔.盖茨是在家中的电脑上看到这封邮件的,当时立即勃然大怒。
他随即下令微软的开发工具、办公软件和其它产品的升级版本都必须具有识别系统异常的能力。这样,当异常被产生时,内核态的错误陷阱处理程序便把处理权交给用户态的应用程序的错误处理程序,就减少了WIN95中的“非法操作”、WIN98中的“蓝屏假死机”出现的频率。
实际上微软是在把用户当猴耍。
还记得“朝三暮四”成语的原始意吗?喂猴的人要采用早三粒、晚四粒的方式饲养,猴子们不同意,当他向它们商量采用早四粒、晚三粒的饲养方式时,猴子们高兴地答应了。无论是核心态截获了系统异常,还是用户态截获了系统异常,其结果都是一样的。
从VB5、VFP6开始,它们具备了识别系统异常的能力。说到这里,我想起了论坛上一位网友曾经建议到:“要避免致命错误c0000005的出现,就使用VFP5.0开发,因为VFP5不会发生这样的错误”,如果真的是这样,我宁愿相信老子所说的“小国寡民”的倒退思想,遗憾的是,VFP5不具备识别异常的能力,当发生的异常被系统核心态截获时,情况会更糟,如果你是从WIN98开始接触电脑的,那么,你一定会对“蓝屏假死机”想象记忆犹新。
VC和DELPHI这两个工具,不但具有识别异常的能力,而且还具备控制异常的能力。这从表面上看起来似乎是件好事,但往往人们用不上,想想看,就连微软的开发大师们都没有能力很好地控制异常,何况是用户呢?
如果你认为“致命错误c0000005”只是VFP的“专利”的话,那么你可就大错特错了。只要是软件在操作系统中运行,它就会有异常现象产生的风险,由于用户态应用程序各自的错误捕获机不同,它的表现形式不同罢了。在VFP6和VFP7中,它表现为由“致命错误”变量+错误名称所组成的信息提示框。
对于VFP6以上版本而言,它有能力识别两种情况的异常:即内存访问侵犯和算术溢出。请注意,这里的“算术”可不是指你在VFP里编的算术程序,它是指系统核心态二进制的算术。
造成这两种情况的原因多种多样。
当年微软官方第一次对用户公开的解释过于草率了,他们认为:
“这并不是微软的错,更不是WINDOWS或VFP的错,而是WIN95WIN98用户使用了老版本的DCOM95DCOM98.DLL。”
现在,您知道了这完全就是愚民政策、掩人耳目!
到后来,VFP开发小组不得不承认其中相当一部分原因是自己的程序所造成的,于是,从SP3开始,“致命错误c0000005”得到了重视。
但是有一点大家应该知道,这并不完全是VFP的错。常常有网友说:即使我安装了SP5,这个问题依然存在。其实这便是VFP外部的原因了。
要想避免“致命错误c0000005”情况的发生,你需要做如下事:
1、安装SP(升级补丁)3版本以上;
2、确保用户的计算机不是兼容机;
3、确保用户的操作系统是正版的或者是完整的;
4、删掉计算机里不稳定的应用程序,如:测试版本的软件、王码五笔输入法等。
5、检查计算机的电流供应是否充足、稳定,打印机、复印机等外设不要与计算机连在同一电路上,计算机芯片是否老化,硬盘是否有坏道(具体请参看本人的《论FOX数据库的安全性》);
6、检查VCX及SCX文件中是否包含了非法属性。
7、向用户建议将操作系统升级到WIN2000+SP2或以上;
8、如果项目很大,请尽量说服客户实现专机专用。