multithreading - 在 Delphi 线程中使用 CoInitialize

标签 multithreading delphi com

我在 Delphi 程序的线程内使用 TIdHttp 和 TXMLDocument。 现在我想知道:

  1. 这些类是否使用 COM 对象,因此我需要在此线程中调用 CoInitialize 和 CoUninitialize?
  2. 如果是,我是否必须在执行方法主体或所有使用 TIdHttp 或 TXMLDocument 类的方法中使用这些函数?

最佳答案

  • TIdHTTP 没有 COM 依赖。

  • TXMLDocument 可以依赖于 COM。在 Windows 上,开箱即用,它是 Microsoft 的 MSXML ActiveX 组件的包装器,该组件使用 COM。如果您使用另一个 DOM 供应商(例如,OmniXML,可从 XE7 获得),则没有 COM 依赖性。您可以通过设置 DefaultDOMVendor 来控制它全局变量。

  • CoInitializeCoUninitialize 必须在线程上下文中调用一次。通常在 TThreadExecute() 方法中,如示例流程所示:

    procedure TMyThread.Execute;
    begin
      try
        CoInitialize(nil);
        try
          while not Terminated do
          begin
            DoWorkThatMayUseCOM;
          end;
        finally
          CoUninitialize();
        end;
      except
        on E: Exception do
          // log exception
          Log(E);
      end;
    end;
    

关于multithreading - 在 Delphi 线程中使用 CoInitialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904464/

相关文章:

c - Delphi dcu 到 obj

c# - WMI 异常 : "COM object that has been separated from its underlying RCW cannot be used"

c# - ASP.NET WebApi 无法与 Azure 中的 COM (Excel) 配合使用

c++ - 两个应用程序/进程如何通过 COM 进行通信?

Java - 使用 Executors.newFixedThreadPool 运行的线程永远不会完成

c# - C#中的无锁优先级队列

Delphi:方法 'Create' 隐藏了基类的虚拟方法 - 但它就在那里

delphi - Release模式下的 EIdSocketError

java - 具有多线程的 Kafka Producer - Java

无法弄清楚如何在我的客户端-服务器模型中实现线程