4

ISAPIアプリから実行されているDelphi2007COMコンポーネントがあります。COMコンポーネントは、MessageBox()を表示しようとしているため、アプリをハングさせています。MessageBox()の呼び出しは、ユーザーコードにないため、DelphiRTLで発生している必要があります。

もちろん、MessageBox()をクリアするためにサーバーにログインしている人がいないため、アプリはハングします。

Delphi RTLが例外時にMessageBox()を表示しようとしないように、Delphiプロジェクトを構成するにはどうすればよいですか?

4

5 に答える 5

3

独自の例外ハンドラーを作成し、それをApplication.OnExceptionイベントにアタッチします。OnExceptionイベントハンドラーが存在する場合、アプリケーションはデフォルトのMessageBoxルーチンを使用しません。署名は次のように定義されます。

TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;

これがサーバーの場合は、例外情報をログに書き込み、ユーザーにエラーを返す可能性があります。

于 2009-06-03T15:20:22.750 に答える
2

メッセージボックスには何と書かれていますか?例外だと思います。COMコンポーネントのコードの周りに例外ハンドラーを配置し、別の方法で例外をログに記録してみませんか?(たとえば、イベントログを使用)。および/または最初に例外につながる問題を修正します。

于 2009-06-03T15:19:42.940 に答える
1

Delphiで直接的な方法はわかりませんが、AutoIT / AutoHotKeyで小さなスクリプトを記述し、そのスクリプトをシステムトレイで実行し続けると、MessageBoxが自動的に閉じます。

とても簡単だと信じてください。

http://www.autoitscript.com/autoit3/index.shtml

http://www.autohotkey.com/

HTH

于 2009-06-03T14:26:35.013 に答える
0

アプリケーションをコンソールアプリとしてコンパイルすることは可能ですか?これを実行してもCOMオブジェクトが含まれているかどうかはわかりません。これにより、メッセージダイアログが表示されなくなる可能性があります。

ちょっとした考え。

于 2009-06-04T10:18:12.487 に答える
-1

(迂回を介して)MessageBox / MessageDlg呼び出しをフックするユニットを作成したので、Windowsサービスでこれらの呼び出しを抑制することができます(メッセージボックス呼び出しを持つ他の誰かの愚かなコードによるサービスdllの「ハング」を回避するため)それ)。よろしければ、このユニットを検索してお送りします。

于 2009-06-04T08:18:00.170 に答える