我的Delphi程序在很大程度上依赖于Outlook自动化. 2007-SP2之前的Outlook版本由于写入错误的插件和写入不正确的Outlook代码而往往被卡在内存中.
如果Outlook被卡住,调用CreateOleObject(‘Outlook.Application’)或GetActiveObject …不返回,并保持我的应用程序挂起,直到Outlook.exe在任务管理器中关闭.
我想到了一个解决方案,但我不知道这是否是好的做法.
我将在单独的线程中使用CreateOleObject启动Outlook,在主线程中等待10秒,如果Outlook挂起(CreateOleObject不返回),则提供用户从我的程序中删除Outlook.exe进程.
但是,由于我不想强制用户杀死Outlook.exe进程,作为替代方案,我还需要一种方法来杀死我的程序中的新线程,该线程现在将保持挂起.
这是好的做法吗?
>如何在Delphi中终止挂线,而不会泄漏内存?
解决方法
Windows具有
TerminateThread功能,但是从这些注释可以看出,使用它通常不是一个好主意.更安全的方法是让一个辅助应用程序与Outlook进行交互,然后你可以杀死它,而不影响你自己的应用程序的稳定性.
TerminateProcess将工作,但如果您想要更系统地使用该系统,Dobbs博士有一个
article可能采用ExitProcess更安全的方法.
如果挂起是一致的,并且始终发生或不发生,您可以在应用程序中调用CreateOleObject并退出,然后再次从您自己的调用.如果不一致,则辅助应用程序可能是更完整的包装器,并且所有的交互都将通过它.