在 Delphi 线程中使用 CoInitialize
Using CoInitialize in a Delphi thread
我在 Delphi 程序的线程内使用 TIdHttp 和 TXMLDocument。
现在我想知道:
- 这些类是否使用 COM 对象,因此我需要在此线程中调用 CoInitialize 和 CoUninitialize?
- 如果是,我是否必须在执行方法的主体或所有使用 TIdHttp 或 TXMLDocument 的方法中使用这些函数 类?
TIdHTTP
没有 COM 依赖。
TXMLDocument 可以 依赖于 COM。在 Windows 上,它是开箱即用的 Microsoft MSXML ActiveX 组件的包装器,它使用 COM。如果您使用另一个 DOM 供应商(例如,OmniXML,可从 XE7 获得),则没有 COM 依赖性。您可以通过设置 DefaultDOMVendor
全局变量来控制它。
CoInitialize
和 CoUninitialize
必须从线程上下文中调用一次。通常在 TThread
的 Execute()
方法中,如本示例流程所示:
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;
我在 Delphi 程序的线程内使用 TIdHttp 和 TXMLDocument。 现在我想知道:
- 这些类是否使用 COM 对象,因此我需要在此线程中调用 CoInitialize 和 CoUninitialize?
- 如果是,我是否必须在执行方法的主体或所有使用 TIdHttp 或 TXMLDocument 的方法中使用这些函数 类?
TIdHTTP
没有 COM 依赖。TXMLDocument 可以 依赖于 COM。在 Windows 上,它是开箱即用的 Microsoft MSXML ActiveX 组件的包装器,它使用 COM。如果您使用另一个 DOM 供应商(例如,OmniXML,可从 XE7 获得),则没有 COM 依赖性。您可以通过设置
DefaultDOMVendor
全局变量来控制它。CoInitialize
和CoUninitialize
必须从线程上下文中调用一次。通常在TThread
的Execute()
方法中,如本示例流程所示: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;