COM-Interface und Delphi



  • Nein, das ist keine forenfremde Frage 🙂

    Folgendes Setup: ich biete per direktem DLL-Call eine Programmierschnittstelle an. Die so aufgerufene DLL erzeugt dann per CoCreateInstance() ein weiteres Objekt, das anschließend benutzt wird.

    Das ganze funktioniert prima - aber nur so lange, wie die oberste DLL nicht aus Delphi heraus aufgerufen wird. Wird das Ganze mit einer Delphi-Applikation gemacht, geht es schief, CoCreateInstance() schlägt fehl.

    Hat jemand einen Tipp was das sein könnte?



  • Elmar schrieb:

    Folgendes Setup: ich biete per direktem DLL-Call eine Programmierschnittstelle an. Die so aufgerufene DLL erzeugt dann per CoCreateInstance() ein weiteres Objekt, das anschließend benutzt wird.

    Du machst aber schlimme Sachen!

    Wer hat den "CoInitialize" aufgerufen? Mit was für einem Threading Modell?

    Elmar schrieb:

    Das ganze funktioniert prima - aber nur so lange, wie die oberste DLL nicht aus Delphi heraus aufgerufen wird. Wird das Ganze mit einer Delphi-Applikation gemacht, geht es schief, CoCreateInstance() schlägt fehl.

    Hat jemand einen Tipp was das sein könnte?

    Na, das einfachste würde sein, wenn Du uns die *Fehlermeldung* mitteilen würdest... dann würdest Du vermutlich sogar schon selber auf die Lösung kommen...



  • > Wer hat den "CoInitialize" aufgerufen? Mit was für einem Threading Modell?

    Die DLL und damit die aufrufende Applikation.

    > Na, das einfachste würde sein, wenn Du uns die *Fehlermeldung* mitteilen
    > würdest...

    Arrgh, da isses ja der Returnwert und nicht GetLastError()...also, es wird CO_E_NOTINITIALIZED zurückgeliefert was an sich aber Blödsinn ist. Ach ja, habe ich schon erwähnt dass dieser ganze Ablauf problemlos klappt, wenn die aufrufende Applikation ein C/C++-Projekt ist und nicht dieses Delphi-Zeugs?



  • Elmar schrieb:

    Arrgh, da isses ja der Returnwert und nicht GetLastError()...also, es wird CO_E_NOTINITIALIZED zurückgeliefert was an sich aber Blödsinn ist. Ach ja, habe ich schon erwähnt dass dieser ganze Ablauf problemlos klappt, wenn die aufrufende Applikation ein C/C++-Projekt ist und nicht dieses Delphi-Zeugs?

    Meinst Du, dass Windows Dir diese Fehlermeldung nur zurückgibt, um Dich zu ärgern? 😉



  • CoInitialize muss meines Wissens für jeden Thread (der Calls auf dem COM Objekt macht) augerufen werden.



  • Elmar schrieb:

    > Wer hat den "CoInitialize" aufgerufen?
    Die DLL und damit die aufrufende Applikation.

    > Na, das einfachste würde sein, wenn Du uns die *Fehlermeldung* mitteilen
    > würdest...
    es wird CO_E_NOTINITIALIZED zurückgeliefert was an sich aber Blödsinn ist.

    Ok, also theoretisch existiert Dein Problem gar nicht...

    Warum machst Du Dir dann sorgen?



  • simon.gysi schrieb:

    CoInitialize muss meines Wissens für jeden Thread (der Calls auf dem COM Objekt macht) augerufen werden.

    Absolut korrekt.

    Jochen Kalmbach schrieb:

    Ok, also theoretisch existiert Dein Problem gar nicht...

    Warum machst Du Dir dann sorgen?

    👍 😃



  • Danke für die "tolle" Hilfe! CoInitialize() wird definitiv aufgerufen (muss ja wohl so ein wenn es ein paar Zeilen weiter davor passiert, oder?), sonst hätte ich wohl kaum geschrieben dass der Fehlercode Blödsinn ist. Das Problem tritt auch nur im Zusammenhang mit Delphi-Applikationen auf - hatte ich auch schon geschrieben.

    Aber entweder ist das Forum hier an sich unbrauchbar oder ich bin hier einfach an ein paar Dummschwätzer geraten, die nur um des Postens willen irgend was posten.

    Also dann: auf nimmer wiedersehen, spielt hier ruhig weiter!


  • Mod

    1. Ich würde trotzdem darauf tippen, dass Du aus einem anderen Thread heraus das Interface benutzt, oder diese Instanz heraus erzeugen möchtest.
    Du darfst COM Zeiger nicht über Threadgrenzen hinweg verwenden!
    2. Bleibt die Frage ob irgendwo CoUninitialize aufgerufen wurde!



  • Elmar schrieb:

    Danke für die "tolle" Hilfe! CoInitialize() wird definitiv aufgerufen (muss ja wohl so ein wenn es ein paar Zeilen weiter davor passiert, oder?), sonst hätte ich wohl kaum geschrieben dass der Fehlercode Blödsinn ist.

    Zeig uns mal den Code!


Anmelden zum Antworten