[WINAPI] CoInitializeEx ?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

[WINAPI] CoInitializeEx ?

Beitrag 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
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [WINAPI] CoInitializeEx ?

Beitrag 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.
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: [WINAPI] CoInitializeEx ?

Beitrag 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.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [WINAPI] CoInitializeEx ?

Beitrag 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.
jumphigh
Beiträge: 19
Registriert: 30.06.2004, 13:41
Kontaktdaten:

Re: [WINAPI] CoInitializeEx ?

Beitrag 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
Psycho
Establishment
Beiträge: 156
Registriert: 16.09.2002, 14:23

Re: [WINAPI] CoInitializeEx ?

Beitrag von Psycho »

Willkommen zurück.
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: [WINAPI] CoInitializeEx ?

Beitrag 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 !)
Antworten