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;