2010-04-04 37 views
10

我的Delphi程序嚴重依賴於Outlook自動化。 2007-SP2之前的Outlook版本由於編寫不好的外掛程式和糟糕的Outlook代碼而導致卡在內存中。如果終止掛起的線程是一個好主意,我該如何安全地做到這一點?

如果Outlook被卡住,調用CreateOleObject('Outlook.Application')或GetActiveObject ...不會返回並保持我的應用程序掛起,直到Outlook.exe在任務管理器中關閉。

我想過一個解決方案,但我不確定是否是好的做法。

我會在一個單獨的線程中使用CreateOleObject啓動Outlook,在我的主線程中等待10秒,並且如果Outlook掛起(CreateOleObject不會返回),則提供用戶從我的程序中終止Outlook.exe進程。

但是因爲我不想強制用戶殺死Outlook.exe進程,作爲替代方案,我也需要一種方法來殺死我的程序中的新線程,它現在一直掛起。

  1. 這是很好的做法?
  2. 如何在Delphi中終止掛起的線程而不會泄漏內存?
+2

「寫得不好」將被視爲既可以作爲一些炎症,或由我們這些誰以前也處理這些冗餘。我分享你的痛苦,兄弟... – 2010-04-05 01:23:43

回答

10

Windows有一個TerminateThread函數,但正如您從備註中看到的那樣,使用它通常不是一個好主意。一種更安全的方法是創建一個與Outlook交互的輔助應用程序,然後可以在不影響自己應用程序穩定性的情況下殺死該應用程序。 TerminateProcess可以工作,但是如果您想對系統稍微友好一點,Dr.Dobbs的article使用ExitProcess可能更安全。

如果掛起是一貫的,往往不是發生或不發生,你可以調用CreateOleObject在應用程序中退出,然後再從自己的調用它。如果不一致,那麼輔助應用程序可能是一個更完整的包裝,並且所有的交互都會通過它。

+0

謝謝你,我沒有想到一個單獨的應用程序,但這完全解決了我的問題。我使用ShellExecuteEx來啓動其他應用程序(它有一個單一的調用CreateOleObject),如果產生的應用程序不返回我要麼終止Outlook或應用程序的用戶請求。 – Steve 2010-04-05 12:29:32

相關問題