Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   rellenar un formulario web automaticamente (https://www.clubdelphi.com/foros/showthread.php?t=73745)

mns 13-05-2011 20:34:48

rellenar un formulario web automaticamente
 
Estoy intentado rellenar un formulario web automaticamente desde builder 6,
concretamente un formulario de hacienda , el 036, cogiendo los datos de una base de datos y no encuentro la manera.
la pagina es la siguiente https://www2.agenciatributaria.gob.e.../ie03700t.html , el formulario esta dentro de un frame , estoy probando cosas pero me da un acces violation
Esto es un codigo que encontre en otra página y que he intentado modificar para capturar el frame ,parece que captura el frame pero luego ya va todo mal , tampoco entiendo mucho el codigo, y no hay manera, como vereis he probado varias cosas a ver si habia suerte pero no.
gracias anticipadas

Código:

    typedef std::map<CComVariant, CComBSTR> MapField;
MapField mf;
mf["A010101"]  = L"43000000K";
mf["A010102"] = L"nombre y apellidos";

CComQIPtr<IHTMLDocument2> doc(web->Document);
CComPtr<IHTMLElementCollection> forms;
CComPtr<IHTMLFramesCollection2> frames;
doc->get_frames(&frames);
CComPtr<IDispatch> disp;
VARIANT n, vFrame;
    n.vt = VT_I4;
    n.intVal = 1;
HRESULT hr = frames->item(&n,&vFrame);//  (Variant("pagi"), Variant());
if (SUCCEEDED(hr))
{

    ShowMessage("hola, hay frame"); // hasta aqui parece que funciona

    CComQIPtr<IHTMLFrameElement> frame(disp);
    CComQIPtr<IHTMLFormElement> form(disp);
    form = frame;
    CComQIPtr<IHTMLInputElement> field;
    for (MapField::iterator ite = mf.begin(); ite != mf.end(); ite++)
    {
        disp = 0;
        // a partir de aqui ni idea(todo mal)
        if (SUCCEEDED(form->item(ite->first, CComVariant(), &disp)) && disp)
        {
            field = disp;
            field->put_value(ite->second);
        }
    }
    //form->submit();
}


mns 15-05-2011 21:28:10

al final me dieron la solución:

<CODE>
pedef std::map<CComVariant, CComBSTR> MapField;
MapField mf;
mf["A010101"] = L"43000000K"; // primeros dos campos del form
mf["A010102"] = L"nombre y apellidos";

// "web" es TCppWebBrowser
CComQIPtr<IHTMLDocument2> doc(web->Document);

// Obtenemos la lista de frames
CComPtr<IHTMLFramesCollection2> frames;
doc->get_frames(&frames);
// long numFrames; frames->get_length(&numFrames);

// De la lista seleccionamos el frame con su nombre
CComVariant frameDisp;
OleCheck(frames->item(&CComVariant("nombreDelFrame"), &frameDisp));
CComQIPtr<IHTMLWindow2> frame(frameDisp.pdispVal);

// Obtenemos el documento de dicho frame
CComPtr<IHTMLDocument2> docFrame;
frame->get_document(&docFrame);

// Seleccionamos el form a rellenar con su nombre
CComPtr<IHTMLElementCollection> forms;
docFrame->get_forms(&forms);
CComPtr<IDispatch> disp;
HRESULT hr = forms->item(CComVariant("nombreDelFormARellenar"), CComVariant(), &disp);

if (SUCCEEDED(hr) && disp)
{
CComQIPtr<IHTMLFormElement> form(disp);
CComQIPtr<IHTMLInputElement> field;
for (MapField::iterator ite = mf.begin(); ite != mf.end(); ite++)
{
disp = 0;
if (SUCCEEDED(form->item(ite->first, CComVariant(), &disp)) && disp)
{
field = disp;
field->put_value(ite->second);
}
}
// form->submit();
}
</CODE>


La franja horaria es GMT +2. Ahora son las 07:42:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi