CoInitialize und
CoUnInitialize müssen im Kontext des Threads aufgerufen werden.
Also sind der Konstruktor und Destruktor tabu, da diese im Kontext des Hauptthreads aufgerufen werden.
Deshalb muss das innerhalb von [TThread].Execute stattfinden:
Delphi-Quellcode:
procedure TCOMThread.Execute;
begin
CoInitialize(nil);
try
// hier findet die eigentliche Arbeit statt
finally
CoUninitialize;
end;
end;
Jetzt muss man aber noch etwas aufpassen!!
Wenn ein Interface-Pointer noch "lebt", nachdem CoUninitialize aufgerufen wurde, dann liegt ein Fehler vor.
Deshalb wird die "eigentliche Arbeit" ausgelagert:
Delphi-Quellcode:
procedure TCOMThread.InnerExecute;
var
a,b, c : IUnknown;
begin
// hier findet die eigentliche Arbeit statt
end;
procedure TApartmentThread.Execute;
begin
CoInitialize(nil);
try
InnerExecute;
finally
CoUninitialize;
end;
end;