在 Delphi 线程中使用 CoInitialize

Using CoInitialize in a Delphi thread

我在 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;