我正在尝试在线程内使用COM接口(interface)。从我所读的内容中,我必须在每个线程中调用CoInitialize/CoUninitialize

虽然这可以正常工作:

procedure TThreadedJob.Execute;
begin
   CoInitialize(nil);

   // some COM stuff

   CoUninitialize;
end;

当我将调用移至构造函数和析构函数时:
TThreadedJob = class(TThread)
...
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;
...

constructor TThreadedJob.Create;
begin
  inherited Create(True);
  CoInitialize(nil);
end;

destructor TThreadedJob.Destroy;
begin
  CoUninitialize;
  inherited;
end;

procedure TThreadedJob.Execute;
begin

   // some COM stuff

end;

我收到 EOleException:CoInitialize没有被称为异​​常,我也不知道为什么。

最佳答案

CoInitialize初始化执行线程的COM。 TThread实例的构造函数在创建TThread实例的线程中执行。 Execute方法中的代码在新线程中执行。

这意味着,如果需要TThreadedJob线程来初始化COM,则必须在CoInitialize方法中调用Execute。或从Execute调用的方法。以下是正确的:

procedure TThreadedJob.Execute;
begin
  CoInitialize(nil);
  try
    // some COM stuff
  finally
    CoUninitialize;
  end;
end;

关于multithreading - TThread和COM- "CoInitialize has not been called",尽管在构造函数中调用了CoInitialize,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38962424/

10-09 07:00