TThread и COM- "CoInitialize не вызывался", хотя CoInitialize вызывается в конструкторе

Я пытаюсь использовать COM-интерфейс в потоке. Из того, что я прочитал, я должен назвать 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 не был вызван исключения и я понятия не имею, почему.

1 ответов


CoInitialize инициализирует COM для выполняющегося потока. В constuctor о TThread экземпляр выполняется в потоке, который создает TThread экземпляра. Код Execute метод выполняется в новом потоке.

это означает, что если вам нужен TThreadedJob поток для инициализации COM, затем вы должны вызвать CoInitialize на Execute метод. Или метод, вызванный из Execute. Верно следующее:

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