Delphi による例外キャッチを無効にして、Windows にキャッチさせたい - 「AppName がクラッシュしました。デバッグ、送信」のようなウィンドウを生成し、これをアプリケーション イベントに追加し、メモリ ダンプを作成します。
デフォルトでは、Delphi は TApplication.Run プロシージャですべての例外をキャッチします... Forms.pas を変更せずにそれを回避するにはどうすればよいですか?
OnException
例外を再発生させるハンドラーを追加できます。
class procedure TMainForm.OnException(Sender: TObject; E: Exception);
begin
raise Exception(AcquireExceptionObject);
end;
initialization
Application.OnException := TMainForm.OnException;
しかし、なぜあなたがこれをやりたいのかはわかりません。madExceptやEurekaLogなどのツールを使用して、システムダイアログよりもはるかに役立つ情報を生成するエラーダイアログを表示するのが一般的です。
JITEnable
'1' 以上に設定できます (デフォルトは '0' です)。'1' の場合は非ネイティブ例外で、'1' より大きい場合は、すべての例外が JIT または WER によって処理されます (システムによって異なります)。
これはあなたが望むものではないかもしれません。このソリューションでは、例外がコードで処理されているかどうかに関係なく、OS に例外が渡されます。明確化 (デバッガーの外部で実行):
procedure TForm1.Button1Click(Sender: TObject);
begin
raise EAccessViolation.Create('access denied');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
PInteger(0)^ := 0;
except
end;
end;
initialization
JITEnable := 1;
最初の例はネイティブ例外で、 が 1 の場合にアプリケーションの例外処理メカニズムによって処理されJITEnable
ます。しかし、2 番目の例は JIT/WER をトリガーします。
独自のハンドラーを追加します。Application.OnException
おそらくあなたが望むものです。環境に応じて異なる動作が得られるため、Windows に任せるよりも優れています。たとえば、Windows エラー報告がオンになっている場合、エラー報告を MS に送信するかどうかをユーザーに尋ねます。
Mr Heffernan のように、EurekaLog のようなものを見ることをお勧めします。
なので。この願いはかなり奇妙だという上記の声に同意します。また、TApplication.OnException を実際にフックするだけで十分だという点にも同意します (「アヒルのように見える場合...」)。
ただし、RTL で例外を無視したい場合は、方法もあります。
例外ハンドラは、ヒープ管理などと同様に、低レベル RTL へのプラグインです。
KOL (Key Objects Library) を見ることができます。Delphi で 5 回、2KB サイズの DLL を作成することができました。
それには、「当然の」機能と考えられている多くの通常の機能がないことが必要でした。その中に例外がありました。
KOL のシステム RTL 置換で例外を有効にするには、いくつかの $DEFINE を作成する必要があり、その後、IDE に例外サポートを追加するコードのロックが解除されました。
モジュール化された RTL バージョンを取得し、その $IfDef を grep して、どのコードがどのコードに置き換えられているかを確認できると思います。それを元に戻し、Windows が例外を介して Delphi RTL を呼び出さないようにすることができる可能性は十分にあると思います。詳細は覚えていませんが、Delphi RTL Exception ハンドラがコールバックとして Windows コアに登録されているだけだと思います。そして、おそらくそれを登録解除できます(nilコールバックを登録してください)。ストックRTLで見つかると思いますが、KOLのモジュール化されたRTLは検索を容易にするだけです.