PDA

Ver la Versión Completa : rellenar un formulario web automaticamente


mns
13-05-2011, 20:34:48
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.es/es13/h/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


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>