Seite 1 von 1

[WINAPI] CoInitializeEx ?

Verfasst: 08.12.2011, 16:43
von ponx
Hallo alle,
ich brauch mal eure Hilfe mit diesem CoInitializeEx !

Diese Thread-Apartments sind für mich schwarze Magie, ich hab noch nicht vollständig begriffen was da passiert.
Und zwar muss der aufrufende Thread, der meine Musik-Library initialisiert, laut Doku mindestens einmal CoInitializeEx aufrufen, weil ich intern XACT benutze. Der Code meiner library ist thread-safe, deshalb wohl am besten mit
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

Weil mein Projekt aber nun eine Library ist, weiß ich ja nicht, ob die aufrufende Applikation das vorher schonmal aufgerufen hat, evtl auch mit abweichenden Parametern. Was mach ich da am besten ? Stur nochmal aufrufen und ggf den Fehlercode ignorieren ? Wenn ich die Doku richtig verstehe, kann ich damit ja wenigstens nicht die aufrufende Threadverwaltung ändern (und damit u.U. die Host-Applikation verpfuschen), aber vielleicht bremse ich damit ja auch meine Lib aus. Oder sollte ich stattdessen lieber selber intern nen eigenen Thread aufmachen ? Das würde die Kapselung meiner Audioschicht dann wahrscheinlich komplizierter machen, in sofern würd ich's gerne vermeiden.

Und zu guter letzt: Die Doku schweigt sich aus, wenn ich im Gegenzug dieses CoUninitialize() aufrufen muss. Während mein Thread noch läuft, will ich ja nix uninitializen.. bzw was wird da dann überhaupt freigegeben ? Wie gesagt - Böhmische Dörfer.. :/

wie immer dankbar für jede Hilfe:
ponx

Re: [WINAPI] CoInitializeEx ?

Verfasst: 08.12.2011, 17:00
von dot
Was ist wenn dus einfach aufrufst und wenn es nicht klappt ebenfalls failest?
Ansonsten kannst du auch einfach in der Dokumentation verlangen, dass die Anwendung CoInitializeEx() aufruft.

Re: [WINAPI] CoInitializeEx ?

Verfasst: 08.12.2011, 17:32
von ponx
dot hat geschrieben:Was ist wenn dus einfach aufrufst und wenn es nicht klappt ebenfalls failest?
Ansonsten kannst du auch einfach in der Dokumentation verlangen, dass die Anwendung CoInitializeEx() aufruft.
Failen darf ich nicht, weil es dann keiner benutzen kann, der selber schon CoInitializeEx aufruft (den Fall hatte ich schon), bzw ich müsste sie dann ggf zwingen, ihre Thread-Verwaltung zu ändern, und evtl verträgt dessen Applikation ja kein Multi-Threaded. Die aufrufende Applikation zu dem Aufruf zu zwingen wär ne Möglichkeit, aber das ist dann ne ziemliche Fehlerquelle, zumal ich mich micht drauf verlassen kann, mit welchen Parametern die's dann tatsächlich aufgerufen haben. Ich müsste meine DLL dann auch mal mit allen Parametern durchtesten, aber Im Moment bin ich schon froh, wenn's mit einem einzigen funktioniert :) Ich hoff ja noch auf ein Standard-Verfahren oder sowas.. ich hab noch keine Ahnung, wie exotisch mein Fall überhaupt ist.

Re: [WINAPI] CoInitializeEx ?

Verfasst: 08.12.2011, 17:36
von Artificial Mind
Afaik hat STA und MTA nix damit zu tun ob deine Anwendung multi- oder single-threaded ist.
Es hat nur was damit zu tun ob du multi-threaded COM-Zugriffe verwendest oder nicht.

Re: [WINAPI] CoInitializeEx ?

Verfasst: 09.12.2011, 07:07
von jumphigh
Wenn du COM-Objekte nicht nur intern in deiner ActiveX-Lib verwendest, sollte dich CoInitializeEx nicht interessieren, weil dein Client vor der Erstellung eines Objektes deiner Lib mittels CoCreateObject selber die COM-Umgebung initialisieren muss.

Für ausschließlich internen Gebrauch kann es in der Tat günstig sein, die von dir genutzten Objekte auf einem eigenen Thread zu erstellen, wo du das Threadingmodell kontrollieren kannst. Benötigst du diese Objekte dann auf dem Main-Thread, musst du sie mittels CoMarshalInterThreadInterfaceInStream über die Threadgrenzen bringen. Das Laufzeitsystem weiß dann, ob unterschiedliche Apartments vorliegen und unternimmt automatisch die nötigen Anstrengungen (Proxy/Stub), damit die Modelle eingehalten werden können.

Am einfachsten bleibt, über die Doku dem Klienten deiner Lib entsprechende Vorschriften zu machen.

Wann CoUninitialize aufzurufen ist, hängt natürlich von deiner Lösung ab. Wenn du selber CoInitialize auf einem Thread bemühst, dann erfolgt CoUninitialize nach Rückgabe aller Interfaces, die dieser Thread hält, und vor dem Rücksprung aus der ThreadProc. Was dabei freigegeben wird, braucht dich ja nun wahrlich nicht zu interessieren.

MfG
Andreas

Re: [WINAPI] CoInitializeEx ?

Verfasst: 09.12.2011, 12:49
von Psycho
Willkommen zurück.

Re: [WINAPI] CoInitializeEx ?

Verfasst: 09.12.2011, 14:56
von ponx
danke euch allen ! ich blick jetzt schon besser durch, und werd das wohl weiterdelegieren an den User und entsprechend in die Doku schreiben. (auch von mir willkommen zurück, jumphigh !)