如何通过程序屏蔽win98的“非法操作”??(300分)

  • 主题发起人 萧月禾
  • 开始时间

萧月禾

Unregistered / Unconfirmed
GUEST, unregistred user!
Win2000编译的程序在Win98下个别模块在打开关闭时会出现“非常操作”,然后则必须关闭
在Win2000下却没事
应该是那几个模块有问题罢
但现在一时来不及修改
也不知道具体错在什么地方,大概是对象创建或释放时导致

请问有没有办法暂时屏蔽这个“非法操作”的窗口??在客户那争取时间再修改之

我在Application.OnException事件中执行 Abort; 不起作用
有别的方法吗??偏方也行。。。。
 
系统中出现的致命问题!
 
http://www.st0754.net/dispprogram.asp?ID=850

防止Win95显示严重错误
  不管你的程序如何反复调试,交给用户之后,总有可能发生你意想不到的错误,如何避免Win95显示出白色的窗口,告诉你的用户发生了难堪的意外错误呢?我们可以这样做:
var
wOldErrorMode:Word;
begin
wOldErrorMode:=SetErrorMode(SEM_FAILCRITICALERRORS);
try
finally
SetErrorMode(wOldErrorMode);
end;
end;

 
to lnboy:
这段代码是在哪里执行?
在主窗体的Create事件下吗?还是在Application.OnException事件中?
对98有效吗?

我试试。。。。。。
 
不起作用。。。。。。

江湖救急呀~~~~~
 
在98下重新编译试试啦!
 
你先查查它到底执行到哪里出这样的错先!然后用try...finally
 
同意楼上,在程序里多加TRY FINALLY!
 
try
finally
end;

try
except
end;
 
能查到哪里错我还需要烦吗?
 
还是需要调试才行的,否则根本不知道错误出在哪里,无从下手。
试试这样先:
假设要出错的模块是 Form3
在 Form3 的 OnCreate 里面写:
procedure TForm3.FormCreate(Sender: TObject);
begin
ShowMessage('Here 1'); // 在 OnCreate 的[red]第一行[/red]添加这个
// ....
ShowMessage('Here 2'); // 在 OnCreate 的[red]最后一行[/red]添加这个
end;

然后编译执行,看 'Here 1' 能否显示出来,要是可以,则恭喜你,问题不大
然后看 'Here 2' 能否显示出来,要是不能,说明问题在中间,比较好解决
然后逐次缩小范围,剩下的不用我说了吧。

其他的,等你试过再说吧。
 
在工程文件中加入下面的试试.
program Project1;

uses
Forms,
SysUtils,
Unit1 in 'Unit1.pas' {Form1};

type
TGlobalExHandler = class
public
procedure HandleExProc(Sender: TObject; ExInstance: Exception);
end;

var
myGloabEx:TGlobalExHandler;
{$R *.res}

{ TGlobalExHandler }

procedure TGlobalExHandler.HandleExProc(Sender: TObject;
ExInstance: Exception);
//该过程什么也不处理试试看
//var
// LastError:Integer;
begin
// LastError:=GetLastError;
// if LastError <> 0 then
// Exit; //你的代码
end;

begin
myGloabEx:=TGlobalExHandler.Create;
Application.OnException:=myGloabEx.HandleExProc;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
 
to beta:
问题不一定发生在打开模块的时候,有时发生在关闭时,也有时发生在
打开后关闭然后再打开时

那问题大概是内存泄漏造成的
请问那里有这方面的测试工具??
 
听说有个叫 BoundsChecker 什么的(名字记不太清楚了),检查内存泄漏很有一套。
你搜一下吧。
 
BoundsChecker我这有,用不了 :(
 
呵呵,那你用 “内存泄漏” 在 Google 上搜一下吧,我还得赶试验报告:)
 
98下的问题比较复杂,我也遇到过的,有时候使用Try...finally...end;也没有用的。
下面是我的一段代码
var
SetingForm: TfrmwwDBGridSetting;
begin
{对表格进行设定}
SetingForm := TfrmwwDBGridSetting.CreateWithFields(
Self,
Addr(wdgMain.DataSource.DataSet.Fields), FIniSecC,
wdgMain.FixedCols,
wdgMain.ReadOnly,
FCanSetFieldRead,
FCanSetFieldName,
FCanSetReadOnly);
try
SetingForm.ShowModal;
if SetingForm.ModalResult = mrOk then
begin
wdgMain.FixedCols := SetingForm.FixedNum;
wdgMain.ReadOnly := SetingForm.ReadOnly;
SetingForm.Close;
......
end;
finally
SetingForm.Free;
end;
end;
经测试2000/XP下没有任何问题,但是98下会出问题,解决的办法是去掉SetingForm.Free
或SetingForm.Close;这一行(显然是去掉后者更好)。因为Close里面设定了
Action := caFree;所以在SetingForm.Free;时本不该出现错误的地方也出错了,虽然号称
Object.Free;是安全的:)
这是一个经验,不知道你的模块的调用中有没有这种地方,有的话在98下就可能出现莫名
的错误了。
 
我上面的这段代码是没有内存泄漏的,事实上这个错误也不是内存泄漏引起的。
所以我想有可能你的程序中也有类似的代码,Close并且Action := caFree;然后Free.
(如果有预先在被调用的窗体中置为nil的代码是肯定要出错的,如Action := caFree;
Form2 := nil;)

对了,还需要注意的就是FormCreate中创建的对象要在FormDestroy中释放,这一点也很关键
虽然是常识,但是有不少程序员都把它放在FormClose中的。
 
最好的办法是预防和测试了
那你就检查show和showmodal的窗口,看哪个会出现这样的情况,如果都是一样的,
那可能只是个别东西没释放,找一个例子看看,
或全程查找create情况,free情况
 
顶部