【问题标题】:Using CoInitialize in a Delphi thread在 Delphi 线程中使用 CoInitialize
【发布时间】:2017-08-11 18:46:14
【问题描述】:

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

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

【问题讨论】:

    标签: multithreading delphi com


    【解决方案1】:
    • TIdHTTP 没有 COM 依赖关系。

    • TXMLDocument 可以依赖于 COM。在 Windows 上,它是开箱即用的 Microsoft 使用 COM 的 MSXML ActiveX 组件的包装器。如果您使用其他 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;
      

    【讨论】:

    • 谢谢whosrdaddy。你的回答很有用。
    • 还有一个问题:使用不必要的 CoInitialize 调用时会不会出现性能问题?
    • @AmirZojaji:不是真的,您在应用程序生命周期中每个线程只调用一次。
    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多