Du vermischt "single/multithreaded appartment" mit "multithreaded application".
Ich mache es immer so:
Jeder thread ruft im Execute CoInitialze/CoUninitialize auf, instantiiert das Interface und arbeitet damit.
Delphi-Quellcode:
Procedure TMyThreadWithInterface.Execute;
Var
MyInterface : IMyInterface;
Begin
CoInitialize();
MyInterface := CoMyInterface.Create();
Try
While not Terminated do WorkWith(MyInterface);
Finally
CoUninitialize();
End
End;
Ich glaube, ein Interface bzw. den Zeiger kann man nicht zwischen Threads hin und her übergeben und deshalb instantiiere ich es im Execute.