2009-06-03 32 views
4

我們有一個Delphi 2007 COM組件正在從ISAPI應用程序執行。 COM組件掛起應用程序,因爲它試圖顯示一個MessageBox()。 MessageBox()的調用必須在Delphi RTL中進行,因爲它不在我們的用戶代碼中。阻止Delphi COM組件顯示MessageBox()

應用程序掛起,當然,因爲沒有人登錄到服務器以清除MessageBox()。

我們如何配置我們的Delphi項目,以便Delphi RTL不會在異常時顯示MessageBox()?

回答

-1

我創建了一個單元來掛接MessageBox/MessageDlg調用(通過繞行),所以我可以在Windows服務中禁止這些調用(爲了避免由於其他人的某些愚蠢代碼「掛起」我的服務dll在它的一個消息框調用)。 如果你想要它,我可以搜索這個單元併發送給你。

1

我不知道在Delphi中有任何直接的方法,但是你可以做的是在AutoIT/AutoHotKey中寫一個小腳本,並讓腳本在系統托盤中運行,這樣它就會自動關閉MessageBox。

相信我這很簡單。

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

http://www.autohotkey.com/

HTH

+0

假設應用程序具有桌面。情況可能並非如此。 – 2009-06-03 15:06:54

+0

我喜歡Autohotkey。 – 2009-06-04 10:16:22

+0

我不認爲這是一個非桌面應用程序。 海報正在Delphi中開發,Delphi目前只生成桌面應用程序。 – 2009-06-04 15:45:15

2

是什麼在MessageBox說?我假設這是一個例外。爲什麼不在COM組件中的代碼周圍放置異常處理程序,並以不同的方式記錄異常? (例如,使用事件日誌)。和/或首先解決導致異常的問題。

+0

不知道消息框的內容。沒有辦法查看它,因爲沒有人登錄。是的,它是一個異常處理程序,因爲這些是RTL中唯一的MessageBox()調用。 – 2009-06-04 17:56:38

3

編寫您自己的異常處理程序並將其附加到Application.OnException事件。如果存在OnException事件處理程序,則應用程序不會使用其默認的MessageBox例程。簽名被定義爲:

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

如果這是一個服務器,你可能會想要寫異常信息的日誌,並可能返回一些錯誤給用戶。

0

是否有可能將應用程序編譯爲控制檯應用程序?我不知道你是否可以做到這一點,仍然有它包含COM對象,這將阻止消息對話框顯示我敢肯定。

只是一個想法。