CoInitializeEx gibt mir einen Fehler zurück



  • Hallo Community,

    ich beschreibe euch mal mein Problem. Ich wollte eine kleine Wrapper-DLL schreiben. Als Basis dient mir das SDK eines Kameraherstellers. In der Dokumentation des Herstellers steht ich solle zuerst einen Interface-Pointer auf ein COM Objekt erstellen. Folgender Quellcode dient als Vorlage:

    // Initialize COM library
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if(FAILED(hr))
    {
        ...
    }
    else
    {
    hr = CoCreateInstance(CLSID_CCamSDK, NULL, CLSCTX_LOCAL_SERVER, IID_ICamSDK, (void**)&InterfacePtr);
    }
    

    Ich habe den Obigen Quellcode in eine exportierten Funktion 'CreateInterfacePtr' gepackt und bereits der Aufruf von CoInitializeEx liefert mir: 0x80010106 Der Threadmodus kann nicht nach dem Einstellen geändert werden.

    Ich bin nun mit meinem Latein am Ende und hoffe das Problem mit eurer Hilfe lösen zu können.

    Cheers



  • Na vermutlich hast du CoInitializeEx() in dem Thread schon irgendwo mal aufgerufen (vermutlich implizit)...



  • Überlege Dir dreimal wo wie Du COM initialisierst. Du musst ja auch wieder CoUninitialize aufrufen, wenn Du "fertig" bist.

    Meistens wird kein Multithreaded Appartment verwendet, brauchst Du das wirklich, können das Deine Klassen? In den meisten Fällen wird ein STA verwendet.

    BTW: Das ist kein C++ Thema, das gehört nach WinAPI!



  • dot schrieb:

    Na vermutlich hast du CoInitializeEx() in dem Thread schon irgendwo mal aufgerufen (vermutlich implizit)...

    Ich selbst rufe diesen Code in der ersten Quellcodezeile auf. Von daher ist es (von meiner Seite) der erste Aufruf.

    Martin Richter schrieb:

    Überlege Dir dreimal wo wie Du COM initialisierst. Du musst ja auch wieder CoUninitialize aufrufen, wenn Du "fertig" bist.

    Meistens wird kein Multithreaded Appartment verwendet, brauchst Du das wirklich, können das Deine Klassen? In den meisten Fällen wird ein STA verwendet.

    Zumindest ist der Beispielcode so ausgelegt.

    Martin Richter schrieb:

    BTW: Das ist kein C++ Thema, das gehört nach WinAPI!

    Sorry, schon wieder falsch. Bin eben kein "gelernter" Programmierer 😉



  • Du hast eine DLL!
    Von daher hat dieser Aufruf eigentlich nichts in Deinem Code zu suchen, oder weißt Du aus welchem Thread Dein Code in der DLL aufgerufen wird oder was die Applikation in der Deine DLL geladen wurde schon getan hat (Eben zum Beispiel ein Aufruf von CoInitializeEx oder OleInitialize?



  • Martin Richter schrieb:

    Du hast eine DLL!
    Von daher hat dieser Aufruf eigentlich nichts in Deinem Code zu suchen, oder weißt Du aus welchem Thread Dein Code in der DLL aufgerufen wird oder was die Applikation in der Deine DLL geladen wurde schon getan hat (Eben zum Beispiel ein Aufruf von CoInitializeEx oder OleInitialize?

    Du hast recht. Hab mal etwas weiter probiert und

    CoCreateInstance(CLSID_CCamSDK, NULL, CLSCTX_LOCAL_SERVER, IID_ICamSDK, (void**)&InterfacePtr);
    

    reicht aus um mit der SDK arbeiten zu können.

    Danke


Anmelden zum Antworten