出错了,撑不住了。。。请各位大虾帮帮忙。。。

时间:2022-09-05 21:09:29
错误内容:
Project xxx raised exception class EAccessViolation with message "Access violation at address 4003BAF4 in module 'rtl70.bpl'. Read of address '00CF1BA0". Process Stopped.

经过测试,发现Application的MainForm里的代码“Self.Close();”是错误的原因。但是不知道具体是什么原因导致的。
另外,在此错误发生前,在其他模块里(已经包含到MainForm里)有Application.MessageBox()调用,然后在Application的MainForm里调用“Self.Close();”。当MessageBox返回IDYES时不发生此错误,返回IDNO时发生此错误。IDYES时继续进行处理(忽略任何自定义错误),IDNO时设置错误信息然后直接返回(到Self.Close()前)。

敬请大家指点。。。

并说明“Self.Close();”出错的详细原因。以及为什么会导致"Access violation at address 4003BAF4 in module 'rtl70.bpl'. Read of address '00CF1BA0"错误,及具体错误处的内容。

9 个解决方案

#1


可能是关闭前有些什么东西没有释放吧,建议仔细检查代码。

#2


自己顶!

#3


你应该单步运行,看错误到底出现在哪一具体行上。

#4


to "Kevin_Lmx(繁华阅尽)":
谢谢。
但是我已经释放了。集中释放:Self.FreeObjects(),自己定义的函数。有try..except..end;保护,基本上改保护的都保护到了。。。估计应该没什么问题吧。。。
但是为什么Self.Close()就是不行呢?而且是在其他模块(应该是对象)中调用Application.MessageBox()后就不行了呢?应该和MessageBox本身没什么关系吧(前面说过了)?
为什么Application.Terminate()就可以?

#5


在“procedure TApplication.Run;”中,AddExitProc(DoneApplication);
“AddExitProc(DoneApplication);干什么用”???
在“DoneApplication”中,“if Handle <> 0 then ShowOwnedPopups(Handle, False);”,这个DoneApplication干什么用???“Destroying; DestroyComponents;”销毁组件?

#6


你的那个集中释放写在哪儿了?是写在form的close事件中吗?

BTW:同意Kevin_Lmx(繁华阅尽)的观点

#7


另外发现:
procedure TComponent.RemoveComponent(AComponent: TComponent);
begin
  ....
  Notification(AComponent, opRemove);
  ....
end;
当程序发生上面的错误后,查看CPU窗口,发现错误处在Notification内!
难道是Notification导致的错误?
我的程序里的自定义对象都是继承自TObject的。并且都确保可以正确释放。

除了DLL中的Form。。。程序中动态加载几个自己作的DLL(里面有Form检查过应该没问题的),并创建Form。如果说解除组件发生错误,那应该只有在这里出问题了。。。但是在Self.Close()前,所有DLL及DLL中的Forms都已经释放了!
晕~~~~

#8


真是要倒掉了。。。。晕死。。。。
真的是DLL的原因。。。。
屏蔽掉DLL就OK了。
但是各位老大,我在Self.Close()前都把所有已创建的Form(从DLL中)都Free了(DLL中的方法)!
为什么还出错??
难道就因为MainForm是fsMDIForm的???不能自动识别由DLL创建的fsMDIChild Form???
而且,我只创建了一个Form(DLL),也不是fsMDIChild的,就是个SplashScreen而已。。。
既然这样,就不应该Notification了吧?就算要他非要Notification(我又管不着),也不至于调试时错误,运行编译好的程序就直接系统99%吧?????????晕死。。。
再查。。。。
希望各位老大继续顶!

#9


更晕了。

先是查到因为Self.Close()导致错误,
Action := caFree;
错,不能设置Action为caFree.
(看了VCL,懂了点,但是不想继续查了,太困了~~~)。

后来发现是因为DLLs的原因导致错误。
(这个比较容易查,释放完了,又调用~~)。

再后来,没进行什么改动,编译了一遍就完全OK了!
(靠!!!受不了!彻底服了M$ & Delphi,一个消息不灵,一个结巴)

决定:结贴!

#1


可能是关闭前有些什么东西没有释放吧,建议仔细检查代码。

#2


自己顶!

#3


你应该单步运行,看错误到底出现在哪一具体行上。

#4


to "Kevin_Lmx(繁华阅尽)":
谢谢。
但是我已经释放了。集中释放:Self.FreeObjects(),自己定义的函数。有try..except..end;保护,基本上改保护的都保护到了。。。估计应该没什么问题吧。。。
但是为什么Self.Close()就是不行呢?而且是在其他模块(应该是对象)中调用Application.MessageBox()后就不行了呢?应该和MessageBox本身没什么关系吧(前面说过了)?
为什么Application.Terminate()就可以?

#5


在“procedure TApplication.Run;”中,AddExitProc(DoneApplication);
“AddExitProc(DoneApplication);干什么用”???
在“DoneApplication”中,“if Handle <> 0 then ShowOwnedPopups(Handle, False);”,这个DoneApplication干什么用???“Destroying; DestroyComponents;”销毁组件?

#6


你的那个集中释放写在哪儿了?是写在form的close事件中吗?

BTW:同意Kevin_Lmx(繁华阅尽)的观点

#7


另外发现:
procedure TComponent.RemoveComponent(AComponent: TComponent);
begin
  ....
  Notification(AComponent, opRemove);
  ....
end;
当程序发生上面的错误后,查看CPU窗口,发现错误处在Notification内!
难道是Notification导致的错误?
我的程序里的自定义对象都是继承自TObject的。并且都确保可以正确释放。

除了DLL中的Form。。。程序中动态加载几个自己作的DLL(里面有Form检查过应该没问题的),并创建Form。如果说解除组件发生错误,那应该只有在这里出问题了。。。但是在Self.Close()前,所有DLL及DLL中的Forms都已经释放了!
晕~~~~

#8


真是要倒掉了。。。。晕死。。。。
真的是DLL的原因。。。。
屏蔽掉DLL就OK了。
但是各位老大,我在Self.Close()前都把所有已创建的Form(从DLL中)都Free了(DLL中的方法)!
为什么还出错??
难道就因为MainForm是fsMDIForm的???不能自动识别由DLL创建的fsMDIChild Form???
而且,我只创建了一个Form(DLL),也不是fsMDIChild的,就是个SplashScreen而已。。。
既然这样,就不应该Notification了吧?就算要他非要Notification(我又管不着),也不至于调试时错误,运行编译好的程序就直接系统99%吧?????????晕死。。。
再查。。。。
希望各位老大继续顶!

#9


更晕了。

先是查到因为Self.Close()导致错误,
Action := caFree;
错,不能设置Action为caFree.
(看了VCL,懂了点,但是不想继续查了,太困了~~~)。

后来发现是因为DLLs的原因导致错误。
(这个比较容易查,释放完了,又调用~~)。

再后来,没进行什么改动,编译了一遍就完全OK了!
(靠!!!受不了!彻底服了M$ & Delphi,一个消息不灵,一个结巴)

决定:结贴!