MSXML Parser / COM Frage ... richtige Vorgehensweise?



  • Hi,

    ich muss für ein kleines Tool den MSXML Parser verwenden.
    Ich habe mir alle benötigten Funktionen zusammengesucht und
    in eine eigene Klasse gesteckt.

    Bis jetzt sehen viele Methoden in der Klasse so aus, dass ich z.B.

    a)
    IXMLDOMDocument *pXMLDom=NULL;
    IXMLDOMNodeList *pNodes=NULL;

    initialisieren muss und zum Schluß wieder

    b)
    if (pXMLDom) pXMLDom->Release();
    if (pNodes) pNodes->Release();

    Nun meine Frage:

    Kann ich a) in den Ctor meiner Klasse stecken und im Dtor b) unterbringen??
    Ich habe es natürlich ausprobiert und prinzipiell geht es ... aber ist es auch "richtiger" Code oder kann da etwas total schief gehen?

    Wieviel "kostet" es mich in jeder Methode a) und b) immer wieder zu schreiben?
    Ich werde es selber wohl kaum merken, da die Datenmenge nicht rießig ist,
    aber mich würde es halt einfach mal interessieren !?!?

    Danke schonmal

    Legolas



  • Ich verschiebe dich mal nach "Rund um die Programmierung".



  • Ich verschiebe dich mal nach "Rund um die Programmierung".

    Hm, das hat wohl nicht so ganz funktioniert 😃

    Da das MSXML-Zeugs für die eigentliche Frage eigentlich nicht relevant ist, passt die Frage schon hier her.

    Kann ich a) in den Ctor meiner Klasse stecken und im Dtor b) unterbringen??

    Das kannst du nicht nur. Das ist sogar eine bekannte und sehr zu empfehlende Technik. So bekannt, dass sie sogar einen Namen hat, nämlich: "resource acquisiton is initialization" kurz RAII.
    Wenn den geposteten Code nur einmal ausführen musst, dann würde ich ihn
    tatsächlich im Ctor/Dtor der Klasse unterbringen. Ansonsten bietet sich eine Smart-Ptr-Klasse an.

    Wieviel "kostet" es mich in jeder Methode a) und b) immer wieder zu schreiben?

    Mindestens 127 Tastaturanschläge.
    Was allerdings viel schlimmer ist, ist die Tatsache, dass solcher Code schnell zu Resource-Leaks führen kann. Besonders falls zwischen a) und b) Exceptions fliegen können.



  • Mann, da ist das Ding so bekannt und ich kenns nicht... schande über mich 🙂 🙂

    Danke @HumeSikkins, dann werde ich das mal umbauen ...



  • Nur ne Frage, wenn du direkt Pointer auf die Schnittstellen verwendest ... IXMLDOMDocument *pXMLDom=NULL; ... wie erzeugst du deine COM-Objecte ??? per Hand ? also mit CoCreateInstance ?

    Ich benutze im Moment nur die ATL (kein MFC), da ists kein problem mit den Smart Pointern (CComQIPointer) ... Also keine Ahnung, wie das die MFC untersteutzt, bin mir aber sicher, das es da auch sowas wie smartpointer gibt.

    Ein Tip noch:
    Die meiste Zeit beim Erstellen/Holen von ComponentZeigern verbraet man mit den "look up" auf der Regestry ... Also wenn man schnell und viel COM Objecte vom selben Typ erzeugen und gleich wieder zerstoeren will, sollte man die eingebauten statischen funktionen der Smartpointer nicht benutzen ... sondern per hand nen Pointer auf die Class-Factory (IClassFactory) erstellen, den speichern, und sich die vielen Objecte nur von der Schnittstelle erzeugen lassen ...

    Ciao ...



  • Hi,

    jau mit CoCreateInstance...

    ...
    IXMLDOMDocument *pXMLDom=NULL;
    ...
    IXMLDOMDocument * XML_Parser::DomFromCOM()
    {
        HRESULT hr;
        //IXMLDOMDocument *pxmldoc = NULL;
    
        HRCALL( CoCreateInstance(__uuidof(DOMDocument40),
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          __uuidof(IXMLDOMDocument),
                          (void**)&pxmldoc),
                "Create a new DOMDocument");
    
        HRCALL( pxmldoc->put_async(VARIANT_FALSE), "should never fail");
        HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE), "should never fail");
        HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE), "should never fail");
    
       return pxmldoc;
    clean:
       if (pxmldoc)
        {
          pxmldoc->Release();
        }
       return NULL;
    }
    ...
    pXMLDom = DomFromCOM();
    

    ist von der microsoft HP http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28000438

    Muss zugeben, dass ich mich mit dem ganzen XML (MSXML) und COM-Zeugs noch nicht so richtig auskenne ... arbeite dran 🙂



  • Hallo,
    diese Probleme haben nun aber nichts mehr mit Standard-C++ zu tun. Wie man COM/MSXML effektiv einsetzt besprecht ihr besser im Rund um-Forum.
    -> Verschoben.


Anmelden zum Antworten