我的Delphi程序非常依赖Outlook自动化。2007-SP2之前的Outlook版本由于编写不当的外接程序和编写不好的Outlook代码而倾向于卡在内存中。
如果Outlook被卡住,调用CreateOleObject('Outlook.Application')或GetActiveObject .不会返回并将应用程序挂起,直到任务管理器中的Outlook.exe关闭。
我想出了一个解决办法,但我不确定这是否是一个好办法。
我会在一个单独的线程中使用CreateOleObject启动Outlook,在我的主线程中等待10秒,如果Outlook挂起(CreateOleObject不返回),则提供给用户从我的程序中删除Outlook.exe进程。
但是,由于我不希望强迫用户终止Outlook.exe进程,作为一种替代方法,我还需要一种方法来杀死我的程序中的新线程,这个线程现在一直挂着。
发布于 2010-04-04 23:11:53
Windows有一个TerminateThread函数,但正如您从备注中看到的那样,使用它通常不是一个好主意。一种更安全的方法是拥有一个与Outlook交互的辅助应用程序,然后您可以在不影响您自己的应用程序稳定性的情况下杀死它。TerminateProcess可以工作,但是如果您想对系统更加友好,Dobbs博士有一个可能更安全的使用ExitProcess的方法的文章。
如果挂起是一致的,并且总是发生或不发生,您可以在应用程序中调用CreateOleObject并退出,然后从自己的应用程序中再次调用它。如果不一致,辅助应用程序可能是一个更完整的包装器,所有的交互都会通过它。
发布于 2010-04-12 13:57:10
此外,您还可以使用线程上下文的eip寄存器。
你可以在那里找到一个样本;
http://www.tugrulhelvaci.com/?p=568
https://stackoverflow.com/questions/2575897
复制相似问题