現在、未処理の例外が発生した場合に別のプログラムにメッセージを送信する、Windows サービスに組み込まれた例外ハンドラーを作成しようとしています。メソッドを作成し、通信が機能するようになりましたが、プログラムがエラーをスローするたびに (強制するコードにレイズ呼び出しがあります)、ウィンドウが代わりにそれをキャッチし、ハンドラーが呼び出されないようです。誰かが私が間違っていることを説明できますか?.
説明する簡略化されたコード:
procedure unhandled();
begin
raise Exception.Create('Unhandled');
end;
procedure ExceptionHandler(ExceptObject: TObject; ExceptAddr: Pointer);
begin
WriteLn('Display: ' + Exception(ExceptObject).Message);
//send Message Here
end;
このコードを呼び出して実行します。
WriteLn('Starting');
ExceptProc := @ExceptionHandler;
unhandled();
出力は次のようになると思います。
開始
表示: 未処理
しかし、それが行うのは表示だけです:
起動
その後、Windows は約 5 秒後にコマンド プロンプトを返します。
ハンドラーが正しく呼び出されないのはなぜですか?
PS テスト用のコンソール アプリでこれらのテストを実行しています。
編集:
さらに詳しい情報は次のとおりです。
明らかに、ExceptProc が割り当てられている場合、プログラムは通常の実行時エラー 217 をスローすべきではありません。これはウィンドウがキャッチしているものだと思いますが、私が見ることができることから、私のプログラムはそのランタイムエラーをスローしており、それをキャッチするための ErrorProc も取得できません。