Запретить компоненту Delphi COM показ MessageBox () - PullRequest
4 голосов
/ 03 июня 2009

У нас есть COM-компонент Delphi 2007, выполняемый из приложения ISAPI. COM-компонент зависает приложение, потому что он пытается отобразить MessageBox (). Вызов MessageBox () должен происходить в Delphi RTL, поскольку он отсутствует в нашем коде пользователя.

Приложение зависает, конечно, потому что никто не вошел на сервер, чтобы очистить MessageBox ().

Как настроить наш проект Delphi таким образом, чтобы Delphi RTL не пытался отображать MessageBox () при исключении?

Ответы [ 5 ]

3 голосов
/ 03 июня 2009

Напишите свой собственный обработчик исключений и присоедините его к событию Application.OnException. Если присутствует обработчик события OnException, приложение не будет использовать свою стандартную подпрограмму MessageBox. Подпись определяется как:

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

Если это сервер, вы, вероятно, захотите записать информацию об исключении в журнал и, возможно, вернуть некоторую ошибку пользователю.

2 голосов
/ 03 июня 2009

Что говорит окно сообщения? Я предполагаю, что это исключение. Почему бы вам не разместить обработчик исключений вокруг кода в компоненте COM и не регистрировать исключение другим способом? (Например, используя журнал событий). И / или исправить проблему, которая в первую очередь приводит к исключению.

1 голос
/ 03 июня 2009

Я не знаю ни одного прямого пути в Delphi, но что вы можете сделать, это написать небольшой скрипт в AutoIT / AutoHotKey и оставить этот скрипт запущенным в системном трее, чтобы он автоматически закрывал MessageBox.

Поверьте мне, это очень просто.

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

http://www.autohotkey.com/

НТН

0 голосов
/ 04 июня 2009

Можно ли скомпилировать приложение как консольное приложение? Я не уверен, что вы можете сделать это, и при этом он содержит COM-объект, это будет препятствовать отображению диалогов сообщений, я уверен.

Просто мысль.

0 голосов
/ 04 июня 2009

Я создал модуль для перехвата вызовов MessageBox / MessageDlg (через обход), поэтому я могу подавить эти вызовы в службе Windows (чтобы избежать «зависания» моей dll службы из-за какого-то глупого кода другого пользователя с вызов сообщения в нем). Если вы хотите, я могу найти это устройство и отправить вам.

...