错误内容:
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"错误,及具体错误处的内容。
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"错误,及具体错误处的内容。
谢谢。
但是我已经释放了。集中释放:Self.FreeObjects(),自己定义的函数。有try..except..end;保护,基本上改保护的都保护到了估计应该没什么问题吧
但是为什么Self.Close()就是不行呢?而且是在其他模块(应该是对象)中调用Application.MessageBox()后就不行了呢?应该和MessageBox本身没什么关系吧(前面说过了)?
为什么Application.Terminate()就可以?
“AddExitProc(DoneApplication);干什么用”???
在“DoneApplication”中,“if Handle <> 0 then ShowOwnedPopups(Handle, False);”,这个DoneApplication干什么用???“Destroying; DestroyComponents;”销毁组件?
procedure TComponent.RemoveComponent(AComponent: TComponent);
begin
....
Notification(AComponent, opRemove);
....
end;
当程序发生上面的错误后,查看CPU窗口,发现错误处在Notification内!
难道是Notification导致的错误?
我的程序里的自定义对象都是继承自TObject的。并且都确保可以正确释放。除了DLL中的Form程序中动态加载几个自己作的DLL(里面有Form检查过应该没问题的),并创建Form。如果说解除组件发生错误,那应该只有在这里出问题了但是在Self.Close()前,所有DLL及DLL中的Forms都已经释放了!
晕~~~~
真的是DLL的原因。
屏蔽掉DLL就OK了。
但是各位老大,我在Self.Close()前都把所有已创建的Form(从DLL中)都Free了(DLL中的方法)!
为什么还出错??
难道就因为MainForm是fsMDIForm的???不能自动识别由DLL创建的fsMDIChild Form???
而且,我只创建了一个Form(DLL),也不是fsMDIChild的,就是个SplashScreen而已
既然这样,就不应该Notification了吧?就算要他非要Notification(我又管不着),也不至于调试时错误,运行编译好的程序就直接系统99%吧?????????晕死
再查。
希望各位老大继续顶!
Action := caFree;
错,不能设置Action为caFree.
(看了VCL,懂了点,但是不想继续查了,太困了~~~)。后来发现是因为DLLs的原因导致错误。
(这个比较容易查,释放完了,又调用~~)。再后来,没进行什么改动,编译了一遍就完全OK了!
(靠!!!受不了!彻底服了M$ & Delphi,一个消息不灵,一个结巴)决定:结贴!