10

我的 Delphi 程序严重依赖 Outlook 自动化。由于插件和 Outlook 代码编写不当,2007-SP2 之前的 Outlook 版本往往会卡在内存中。

如果 Outlook 被卡住,调用 CreateOleObject('Outlook.Application') 或 GetActiveObject ... 不会返回并保持我的应用程序挂起,直到 Outlook.exe 在任务管理器中关闭。

我已经想到了一个解决方案,但我不确定这是否是好的做法。

我会在一个单独的线程中使用 CreateOleObject 启动 Outlook,在我的主线程中等待 10 秒,如果 Outlook 挂起(CreateOleObject 没有返回),请让用户从我的程序中终止 Outlook.exe 进程。

但由于我不想强迫用户终止 Outlook.exe 进程,作为替代方案,我还需要一种方法来终止程序中现在一直挂起的新线程。

  1. 这是好习惯吗?
  2. 如何在不泄漏内存的情况下终止 Delphi 中的挂起线程?
4

2 回答 2

10

Windows 有一个TerminateThread函数,但是从注释中可以看出,使用它通常不是一个好主意。更安全的方法是拥有一个与 Outlook 交互的辅助应用程序,然后您可以在不影响您自己的应用程序稳定性的情况下终止它。 TerminateProcess会起作用,但如果您想对系统更友好一点,Dobbs 博士有一篇文章介绍了使用 ExitProcess 可能更安全的方法。

如果挂起是一致的并且总是发生或不发生,您可以在应用程序中调用 CreateOleObject 并退出,然后从您自己的再次调用它。如果不一致,则辅助应用程序可能是一个更完整的包装器,并且所有交互都将通过它。

于 2010-04-04T23:11:53.570 回答
0

此外,您可以使用线程的 Context 的 eip 寄存器。

您可以在以下位置找到样品;

http://www.tugrulhelvaci.com/?p=568

于 2010-04-12T13:57:10.537 回答