在Delphi线程中使用CoInitialize

Ali*_*aji 2 delphi com multithreading

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

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

who*_*ddy 6

  • TIdHTTP 没有COM依赖项。

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

  • CoInitialize并且CoUninitialize必须在线程上下文中调用一次。通常在的Execute()方法中TThread,如本示例流程所示:

    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;
    
    Run Code Online (Sandbox Code Playgroud)