Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Como veo el contenido del CppWebBrowser?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Como veo el contenido del CppWebBrowser? Responder citando

Como veo el contenido del CppWebBrowser? He leido varios correos en el foro y tengo el siguiente codigo:

IHTMLDocument2 *HTMLDocument;
IHTMLElement *pElement;
wchar_t *tmp;
AnsiString texto;

if (CppWebBrowser1->Document) {
CppWebBrowser1->Document->QueryInterfaceIID_IHTMLDocument, (void**)&HTMLDocument);
HTMLDocument->get_body(&pElement);
pElement->get_innerHTML(&tmp);
texto = AnsiString(tmp);
pElement->Release();
HTMLDocument->Release();
}

Pero me da un EAccessViolation al llegar al pElement->get_innerHTML(&tmp);
lo he depurado y pElement vale NULL,
que sucede como lo hago, me dais por favor alguna alternativa ?

Gracias
Volver arriba
Mensaje    Asunto: Responder citando

Hola:

Creo que te ocurre porque intentas leer el contenido del TCppWebBrowser cuando aun no ha acabado de cargar todo el documento, al menos es así de la única manera que he conseguido reproducir el problema.

Puedes comprobar si esta cargando algo o ha terminado usando su propiedad 'Busy'.

Si te sigue dando problemas y quieres probar un pequeño ejemplo que a mí me funciona. He hecho algunos pequeños cambios para que lea todo el documento y no lo que hay entre las etiquetas <body></body>:

- Creamos un proyecto nuevo y añadimos un TCppWebBrowser (CppWebBrowser1), un TMemo (Memo1) y un TButton (Button1).

- Y simplemente metemos el siguiente código en el OnClick del Button1:
Código:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    //Añadimos: #include<mshtml.h>

    // Cargarmos un documento y esperamos a que termine
    CppWebBrowser1->Navigate(L"http://www.borland.com");
    while (CppWebBrowser1->Busy)
        Application->ProcessMessages();

    if (CppWebBrowser1->Document)
    {

        IHTMLDocument2 *pDocument;
        CppWebBrowser1->Document->QueryInterface<IHTMLDocument2>(&pDocument);
        IHTMLElement *pElement;
        pDocument->get_body(&pElement);
        pElement->get_parentElement(&pElement);
        wchar_t *tmp;
        pElement->get_outerHTML(&tmp);
        Memo1->Lines->Text = tmp;
        pElement->Release();
        pDocument->Release();
    }
}


y una segunda manera de hacerlo que tiene la ventaja de que lee el documento completo, incluso si hubiese algo antes de <html> o despues de </html>. Sustituimos el código del mismo botón por:
Código:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    //Añadimos: #include<mshtml.h> #include<ocidl.h> y #include<objidl.h>

    // Cargarmos un documento y esperamos a que termine
    CppWebBrowser1->Navigate(L"http://www.borland.com");
    while (CppWebBrowser1->Busy)
        Application->ProcessMessages();

    if (CppWebBrowser1->Document)
    {
        IHTMLDocument2 *pDocument;
        CppWebBrowser1->Document->QueryInterface<IHTMLDocument2>(&pDocument);
        IPersistStreamInit *pPersistStreamInit;
        pDocument->QueryInterface<IPersistStreamInit>(&pPersistStreamInit);
        IStream *pStream;
        CreateStreamOnHGlobal(NULL, true, &pStream);
        if (pStream)
        {
            __int64 tamanyo = 0;
            STATSTG ss;
            LARGE_INTEGER pos;
            pos.QuadPart = 0;
            pPersistStreamInit->Save(pStream, true);
            pStream->Seek(pos, STREAM_SEEK_SET,
                reinterpret_cast<ULARGE_INTEGER*>(&tamanyo));
            pStream->Stat(&ss, STATFLAG_NONAME);
            tamanyo = ss.cbSize.QuadPart;
            String strContenido;
            strContenido.SetLength(tamanyo);
            pStream->Read(const_cast<void*>(strContenido.data()), tamanyo,
                reinterpret_cast<ULONG*>(&tamanyo));
            pStream->Release();
            Memo1->Lines->Text = strContenido;
        }
        pPersistStreamInit->Release();
        pDocument->Release();
    }
}


Saludos:
_Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Muchas Gracias Responder citando

Gracias _Leo, va como la seda!
Volver arriba
Mensaje    Asunto: Pequeña modificacion. Responder citando

_Leo he modificado tu primera opcion que me diste y en vez de hacer un get_outterHTML(&tmp), he hecho pElement->get_innerText(&tmp); que me devuelve solo el contenido del body y además en texto plano sin sentencias HTML, cosa que me viene al pelo el simplemente para comprobar que cierto script se ejecuto bien.

Te cuento poco, tengo que hacer un programa que sincronize de vez en cuando nuestra BD local con una BD remota, a la cual solo puedo acceder por PHP, así que lo que he hecho es poner en el servidor un SCRIPT PHP que me dice si cierto script que ejecuta cada vez que se llama se ejecuta bien o no, simplemente diciendo en el body de un fichero HTML, ERROR u OK. Comprendes ?

Asi que lo que hago yo para sincronizar la BD es subir al servidor Web un fichero por FTP con todas las sentencias SQL que me interesan, entonces el programa lo siguiente que hace es abrir en el CppWebBrowser el archivo PHP remoto, el cual me devuelve ERROR u OK. Entonces con lo que tu me has dado compruebo si todo fue bien o no.

Gracias _Leo me hacía mucha falta y no me terminaba de funcionar, sinceramente muchas gracias, por cierto soy XyVy, por si alguna vez nos hemos visto por el IRC. Cuidate!
Razz
Volver arriba
Mensaje    Asunto: Vaya a saber Responder citando

Bueno, acá vá una posible alternativa:

Si salió bien,

HRESULT IHTMLElement::get_parentElement(&pElement);
devuelve S_OK,

así que convendría hacer esa comprobación.

Alejandro
Volver arriba
Mensaje    Asunto: Responder citando

Es decir Alejandro me sugieres que haga la comprobación de ver si al hacer HRESULT IHTMLElement::get_parentElement(&pElement); devuelve S_OK, supongamos que no , entonces vuelvo a ejecutarlo todo ?

Gracias por cierto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Sí, pero mirándolo mejor, si la excepción se dispara en esa línea, antes convendría verificar que

HRESULT IHTMLDocument2::get_body(IHTMLElement &pElement);

también devuelve S_OK, y que &pElement sea válida.


Alejandro
Volver arriba
Mensaje    Asunto: Responder citando

Gracias de nuevo Invitado, asumo que eres Alejandro, gracias. A ver si lo pruebo aun no he tenido mucho tiempo para volver a eso, pero tengo que solucionarlo porque es un punto critico del programa.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: modificado el ejemplo de leo Responder citando

Bueno, pues yo he modificado el ejemplo de leo, y suponiendo que tengamos un Edit para meter la direccion url...este es el codigo para que "vaya" hacia alli...

dir_URL tiene un tamaño de 380 caracteres simplemente porque se me ocurrio asi...me parecio bastante para una URL


Código:


        wchar_t dir_URL[380];

   Edit_URL->Text.WideChar(dir_URL, 380);
      //ShowMessage(dir_URL);
      // Cargarmos un documento y esperamos a que termine
    CppWebBrowser1->Navigate(dir_URL);
    while (CppWebBrowser1->Busy)
       {
        Application->ProcessMessages();
        }   

Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo me parece genial este post , por ahi estaba yo volviendome loco al simular las teclas ctrl + e y ctrl + c que me habian dejado aca en el foro , ahora tengo problemas con estos dos ejemplos que dejas aca

yo no cargo una pagina web , sino un documento html que esta en la pc con extencion html con el siguiente codigo

TVariant ruta = dir;
cppWB->Navigate2(&ruta);
luego trato de mostrar el contenido en un RichEdit

1- con el primer ejemplo me funciona pero me salen los encabezados <html><body> y demas por lo que me propuse utilizar el segundo ejemplo

2- en el segundo ejemplo casi todo el contenido cuando se guarda en el RichEdit lo que me muestra son caracteres no se si en chinos o japones ( no se distinguir el idioma) , pero bueno no es castellano y no se porque motivos sera

_Leo recuerda que uso el c++ 2009 ( por si el problema vienen por alli)

gracias
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Cambia la línea:

String strContenido;

por:

AnsiString strContenido;
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo no me fije bien en el codigo , ultimamente cuando veo que el codigo no me funciona al trasladar del buidel 6 u otro al 2009 siempre me fijo tanto en los String y AnsiString , tambien en los c_str() y los t_str() para cambiarlos adecuadamente y no tener que preguntar al foro por algo que se aveces es un simple cambio (aveces resultan un tanto molestos ademas de que aunque se que me has explicado aveces no acabo de entender el porque del cambio y el porque de ponerlos -lo hago de manera automatica sin saber concientemente que es lo que hago- muy feo verdad a mi tampoco me gusta eso de hacer sin saber que hago), pero bueno
nuevamente muchas gracias
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.