2016-08-15 6 views
8

Я пытаюсь использовать COM-интерфейс в потоке. Из того, что я прочитал, я должен позвонить CoInitialize/CoUninitialize в каждом потоке.TThread и COM - «CoInitialize не был вызван», хотя CoInitialize вызывается в конструкторе

В то время как это работает отлично:

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 не был вызван исключение, и у меня нет подскажите почему.

ответ

18

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

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

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

Благодарим за молниеносный ответ. – forsajt