错误内容:
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"错误,及具体错误处的内容。

解决方案 »

  1.   

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

  2.   

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

  3.   

    你的那个集中释放写在哪儿了?是写在form的close事件中吗?BTW:同意Kevin_Lmx(繁华阅尽)的观点
      

  4.   

    另外发现:
    procedure TComponent.RemoveComponent(AComponent: TComponent);
    begin
      ....
      Notification(AComponent, opRemove);
      ....
    end;
    当程序发生上面的错误后,查看CPU窗口,发现错误处在Notification内!
    难道是Notification导致的错误?
    我的程序里的自定义对象都是继承自TObject的。并且都确保可以正确释放。除了DLL中的Form程序中动态加载几个自己作的DLL(里面有Form检查过应该没问题的),并创建Form。如果说解除组件发生错误,那应该只有在这里出问题了但是在Self.Close()前,所有DLL及DLL中的Forms都已经释放了!
    晕~~~~
      

  5.   

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

  6.   

    更晕了。先是查到因为Self.Close()导致错误,
    Action := caFree;
    错,不能设置Action为caFree.
    (看了VCL,懂了点,但是不想继续查了,太困了~~~)。后来发现是因为DLLs的原因导致错误。
    (这个比较容易查,释放完了,又调用~~)。再后来,没进行什么改动,编译了一遍就完全OK了!
    (靠!!!受不了!彻底服了M$ & Delphi,一个消息不灵,一个结巴)决定:结贴!