IHTMLElement



  • hallo welt!
    gerade bastle ich ne anwendung, welche im IWebbrowser automatische Vorgange durchführen soll.
    Dies klappt nun auch schon recht gut beim Ausfüllen von Input-Elementen mittels put_value des IHTMLInputElement.
    Doch leider treten größere Probleme auf, wenn diese Funktion über eine Textarea stolpert bzw diese vervollständigen soll.
    also hab ich mir gedacht, eine kleine fallunterscheidung durchzuführen, um zu unterscheiden, ob es sich um eine textarea oder irgendein input elemnt handelt.
    hierfür mpsste ich dann wohl ein allgemeineres element verwenden, wofür mir IHTMLElement passend erscheint.
    Doch wie bekomm ich die art des html-elements, um es prüfen zu können?
    oder wie lässt sich das am besten und evt einfach realisieren?

    es sei noch gesagt, dass das Element folgendermaßen zu Stande kommt:

    IHTMLElement *pInput3 = NULL;
                            pDisp->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&pInput3);
    

    Bitte um Hilfe.
    Vielen Dank!



  • (gehört wohl eher ins WinAPI-Forum)

    IHTMLElement::get_tagName, oder QueryInterface auf IHTMLTextAreaElement



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ist tag name nicht die bezeichnung des objekts?
    gesucht ist der type...
    danke



  • ach! Das HTML heißt ja

    <input type="TextArea">
    

    ....

    OK, dann müßte es:

    _variant_t v;
    HRESULT hr = IHTMLElement::getAttribute(_bstr_t("type"), 0, &v);
    if (hr == S_OK && (variant contains a string which is TEXTAREA))
    {
      Wir haben ein TextArea
    }
    

    QueryInterface nach IHTMLTextAreaElement ist dann aber evtl. einfacher 🙄



  • hallo nochmal.
    ich bin leider immer noch am verzweifeln da ich mich mit dem selben müll herumplagen muss und keiner hilft oder helfen kann 😞

    also, es steht doch fest, dass sowohl ihtmlinputelement, als auch das ihtmltextareaelement die selbe funktion put_value verwenden, um diesen wert zu setzen. und mehr will ich ja auch nicht. dass darf doch nicht so schwer sein.
    nun müsste doch beides mit ein und der selben struktur gehen, oder?!
    dafür sollte IHTMLElement das primitiveste und am geeignetste sein.
    hierbei gibt es die folgende funktion:

    HRESULT setAttribute(          BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags
    );
    

    nun hab ich mir was zusammengebastelt, was leider in keiner weise funktioniert, sondern ne zugriffsverletzung erzeugt.
    ich poste hier einfach mal die ganze funktion:

    int ausfuellen(TCppWebBrowser &WB,int form,AnsiString feld,AnsiString inhalt)
    {
            int typ=0;
            IHTMLElement *pInput3 = NULL;
            CComBSTR bstr("value");
            VARIANT var;
            var.pbVal="test"; //hier soll eigentlich inhalt rein
            HRESULT get_tagName(BSTR *tagName);
            IHTMLDocument2 *HTMLDoc = NULL;
            IHTMLElementCollection *pAll = NULL;
            TVariant name = feld;
            IDispatch *pDisp = NULL;
            TVariant index=form;
            try
            {
                    if(SUCCEEDED(WB.Document->QueryInterface(IID_IHTMLDocument2,
                      (LPVOID*)&HTMLDoc)))
                    {
                      if(SUCCEEDED(HTMLDoc->get_all(&pAll)))
                      {
                        if(SUCCEEDED(pAll->item(name, index, &pDisp)))
                        {
                          if(pDisp)
                          {
                            IHTMLElement *pElement = NULL;
                            pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement);
                            pElement->setAttribute(bstr,var,0);
                            //soweit kommts nicht, da bereits der zugriffsfehler eine zeile zuvor aufgetreten ist!
                          }
                        }
                      }
                    pAll->Release();
                    }
                    HTMLDoc->Release();
            }
            catch
            (...){}
    return 0;
    }
    

    is sicher viel unsinniges zeug drin. daher bitte ich sehr um verbesserung und korrektur.

    würde mich wirklich sehr freuen, wenn jemand das mit setattribute hinbekommen würde, denn ich bin erstmal am ende!

    schönen tag noch,
    und DANKE



  • OK, die "ersten kleinen Fehler" die ich finde:

    VARIANT var; 
    var.pbVal="test"; //hier soll eigentlich inhalt rein
    

    Hier fehlt auf alle fälle setzen des VarTypes (vt), and legalerweise mußt du den String anders allozieren. überlicherweise:

    VARIANT var;
    var.vt = VT_BSTR;
    var.bstrVal = SysAllocString(L"test");
    //... use var
    VariantFree(&var);
    
    HRESULT get_tagName(BSTR *tagName);
    

    Ist nur eine Deklaration

    Was ist TVariant? scheints als hättest Du ja bereits eine brauchbare wrapper-Klasse für VARIANT.

    (B)
    Ich würde dir ganz stark ans Herz legen, (a) Smart Pointer für die Interface-zeiger zu verwenden und (b) einen der möglichen wrapper für VARIANT.

    persönlich bevorzuge ich die COM Supportklassen von VC++, also in diesem Fall _com_ptr_t, _variant_t und _bstr_t. Damit sparst Du dir ne Menge Referenzzählen...



  • würde sich dadurch in irgendeiner weise was an dem fehlerverhalten von pElement->setAttribute(bstr,var,0); ändern?

    danke



  • ja, 1. - dein var ist ungültig 🙂



  • na gut.
    nun hab ich den 1. punkt befolgt.
    keine fehlermeldung mehr. aber leider auch kein resultat.

    Ist nur eine Deklaration 
    
    Was ist TVariant? scheints als hättest Du ja bereits eine brauchbare wrapper-Klasse für VARIANT. 
    
    (B) 
    Ich würde dir ganz stark ans Herz legen, (a) Smart Pointer für die Interface-zeiger zu verwenden und (b) einen der möglichen wrapper für VARIANT. 
    
    persönlich bevorzuge ich die COM Supportklassen von VC++, also in diesem Fall _com_ptr_t, _variant_t und _bstr_t. Damit sparst Du dir ne Menge Referenzzählen...
    

    mit den wrappern bin ich wohl ärmer dran, da ich borland c++ hab.

    nun sollten wir jedoch festhalten, dass bis dahin kein fehlverhalten vorhanden ist, sondern erst in der zeile mit setattribute etwas schief geht.
    könntest Du mir diese bitte auch noch irgendwie verbessern.
    wie gesagt: es erscheint keine fehlermeldung mehr. hab nun auch try...catch... weggemacht.
    aber die value eigenschaft des jeweiligen objekts wird nicht verändert.

    vielen dank für hilfe



  • @rabby
    kannst du mir sagen wie man den IWebBrowser in sein Projekt bringt und in einem Window anzeigt, oder hast du einen Link mit einem Sample oder so zur MSDN, denn dort finde ich nichts brauchbares.

    ist glaub ich die "Exdisp.h" die ich einbinden muß?



  • #include <mshtml.h>
    #pragma link "SHDocVw_OCX"



  • Danke,
    aber wie ruf ich den auf?

    IWebBrowser *wb;
    wb->???? // wo hin im Fenster
    // ??? etc.
    

    Das mit Navigate etc. weiß ich, aber nicht wie ich ihn in mein Window bringe.


Anmelden zum Antworten