Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如果终止挂起的线程是一个好主意,那么如何安全地执行它?_Delphi_Multithreading_Outlook_Automation - Fatal编程技术网

Delphi 如果终止挂起的线程是一个好主意,那么如何安全地执行它?

Delphi 如果终止挂起的线程是一个好主意,那么如何安全地执行它?,delphi,multithreading,outlook,automation,Delphi,Multithreading,Outlook,Automation,我的Delphi程序严重依赖Outlook自动化。由于外接程序编写错误和Outlook代码编写错误,2007-SP2之前的Outlook版本往往会卡在内存中 如果Outlook被卡住,请调用CreateOleObject('Outlook.Application')或GetActiveObject。。。在任务管理器中关闭Outlook.exe之前,不会返回并保持应用程序挂起 我已经想到了一个解决办法,但我不确定这是否是一个好的做法 我会在一个单独的线程中使用CreateOleObject启动Ou

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

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

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

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

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

  • 这是好的做法吗
  • 如何在Delphi中终止挂起的线程而不泄漏内存
  • Windows有一个功能,但正如您从备注中看到的,使用它通常不是一个好主意。更安全的方法是使用一个与Outlook交互的辅助应用程序,然后您可以在不影响自己的应用程序稳定性的情况下杀死它。这会起作用,但如果你想对系统友好一点,Dobbs博士有一个可能更安全的方法,使用ExitProcess


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

    此外,您可以使用线程上下文的eip寄存器

    您可以在以下网址找到样品:


    “写得不好”会被一些人视为煽动性的,或者被我们这些曾经处理过这些问题的人视为多余的。我和你一样痛苦,兄弟……谢谢你,我没有想到单独的申请,但这完全解决了我的问题。我正在使用ShellExecuteEx启动另一个应用程序(只调用一次CreateOleObject),如果生成的应用程序没有返回,我将根据用户请求终止outlook或应用程序。