| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Invitado Invitado
|
Publicado: Mie 04 Dic, 2002 4:08 pm Asunto: Como veo el contenido del CppWebBrowser? |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 04 Dic, 2002 6:20 pm Asunto: |
|
|
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 |
|
 |
Invitado Invitado
|
Publicado: Mie 04 Dic, 2002 8:08 pm Asunto: Muchas Gracias |
|
|
| Gracias _Leo, va como la seda! |
|
| Volver arriba |
|
 |
Invitado Invitado
|
Publicado: Mie 04 Dic, 2002 8:25 pm Asunto: Pequeña modificacion. |
|
|
_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!
 |
|
| Volver arriba |
|
 |
Alejandro Invitado
|
Publicado: Sab 16 Ago, 2003 7:15 pm Asunto: Vaya a saber |
|
|
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 |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Dom 17 Ago, 2003 12:42 am Asunto: |
|
|
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 |
|
 |
Invitado
|
Publicado: Dom 17 Ago, 2003 2:28 am Asunto: |
|
|
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 |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Dom 17 Ago, 2003 11:29 pm Asunto: |
|
|
| 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 |
|
 |
Shed Cdt

Registrado: 05 Dic 2005Mensajes: 3
|
Publicado: Mar 24 Ene, 2006 5:40 pm Asunto: modificado el ejemplo de leo |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 06 Mar, 2009 4:07 pm Asunto: |
|
|
_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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 06 Mar, 2009 5:07 pm Asunto: |
|
|
Cambia la línea:
String strContenido;
por:
AnsiString strContenido; |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 06 Mar, 2009 6:32 pm Asunto: |
|
|
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 |
|
 |
|