COM aggregation



  • Hallo,
    ich habe ein Problem mit der Aggregation in COM.
    Wenn ich QueryInterface (unter C++) auf dem Objekt aufrufe, um es in die andere Klasse zu "casten" erhalte ich als HRESULT E_NOINTERFACE zurück.
    Das soweit zur Fehlerbeschreibung.
    Jetzt meine Versuche:
    Ich habe zwei COM Objekte in zwei verschiedenen .tlbs (.dlls). Das eine soll das andere aggregieren (wäre relativ wichtig für mich, dass dies implizit geht).
    Nun importiere ich die lib im library Teil der idl des zweiten COM-Objektes mittels

    importlib("another.tlb");
    

    das scheint auch zu funktionieren, da alles einwandfrei kompiliert.
    anschließend sage ich der coclass, welche neu hinzu kommt in dieser entsprechenden idl, dass sie das andere Interface unterstützt mittels:

    coclass AnotherClass
    {
    [default] interface IAnotherClass;
    		interface IFirstInterface;
    }
    

    das geht so weit auch noch, wie gesagt, es treten keine Compilerfehler auf.
    Das IFirstInterface sollte auch durch das Importieren der tlb "another.tlb" bekannt sein.
    In der Implementierung von AnotherClass (CAnotherClass) habe ich folgende Einträge hinzugefügt:

    DECLARE_GET_CONTROLLING_UNKNOWN()
    CComPtr<IUnknown> m_pInnerUnknown;
    COM_INTERFACE_ENTRY_AGGREGATE( __uuidof( FirstClass ), m_pInnerUnknown.p )
    // und in FinalConstruct:
    m_pInnerUnknown.CoCreateInstance( __uuidof( FirstClass), GetControllingUnknown(), CLSCTX_INPROC_SERVER );
    

    soweit so gut, in FinalConstruct wird auch das richtige Objekt erzeugt.
    Allerdings, wenn ich die ganze Konstruktion so laufen lasse, erhalte ich bei einer Zuweisung der Zeiger, oder einem QueryInterface-Aufruf das HRESULT E_NOINTERFACE zurück.
    Allerdings habe ich keine Ahnung, wieso, da ich dachte, dass eigentlich alles richtig implementiert ist.
    Kann mir jemand helfen, bzw weiß jemand, warum das Ganze fehl schlägt?
    thx so far



  • erm, jo, war ein Problem, dass C# (in welchem ich es testweise benutzt habe) die Interops nicht nachgeneriert hat...


Log in to reply