19

シャットダウン中に問題が発生し、ソースまでさかのぼることができない例外が発生するプログラムがあります。タイミングに関連し、非決定論的であるように見えます。これは、すべての共有リソースが解放された後に発生します。シャットダウンされているため、メモリリークは問題になりません。そのため、共有リソースを解放した後、プログラムにただちにサイレントに終了するように指示する方法があるのではないかと思います。シャットダウンシーケンスを続行し、例外メッセージボックスを表示します。

誰かがそれを行う方法を知っていますか?

4

5 に答える 5

19

DelphiランタイムライブラリのソースコードとMicrosoftのドキュメントを確認した後。メイソンとポールジャンのコメントを裏付けることができます。

シャットダウンの階層は次のとおりです。

  Application.Terminate()
    performs some unidentified housekeeping of application
    calls Halt()

  Halt()
    calls ExitProc if set
    alerts the user in case of runtime error
    get rid of PackageLoad call contexts that might be pending
    finalize all units
    clear all exception handlers
    call ExitprocessProc if set
    and finally, call ExitProcess() from 'kernel32.dll'

  ExitProcess() 
    unloads all DLLs
    uses TerminateProcess() to kill the process
于 2009-07-26T18:41:03.953 に答える
6

ExitProcess(0)?

于 2009-07-26T16:50:22.570 に答える
4

Halt(0) は、プログラムを即時に終了するように指示する古き良き方法でした。おそらく、より Delphi に適した方法でこれを行うことができますが、halt(0) が引き続き機能することは 95% 確信しています。:-)

于 2009-07-26T17:05:02.837 に答える
4

ExitProcess() を使用するという HeartWare の提案が失敗した場合、DLL_PROCESS_DETACH にうまく応答しない DLL を使用している可能性があります。その場合は、 TerminateProcess( getCurrentProcess, 0 ); を使用してみてください。

このような手段に頼ると、トピックのタイトルの「きれいに」の部分がまだ精査に耐えられるかどうか疑問に思うかもしれません。

于 2009-07-26T17:08:01.487 に答える
1

このような問題を最後に追跡しなければならなかったのは、シャットダウンが原因でイベントが発生し (サイズ変更ですか? しばらく経ちました)、死にかけているウィンドウで発生し、既に破棄されたものを必要とするものを再描画しようとしたことでした。

于 2009-07-26T18:01:11.473 に答える