Cómo utilizar la programación VC para implementar el escaneo de versiones del navegador
#include?"stdafx.h"
#include?"EnumFormVal.h"
#include?
CComModule?_Module;?//?Como desea utilizar un puntero inteligente a?CComDispatchDriver?ATL ///?, debe declararlo
#include?
#include?
#ifdef?_DEBUG
#define?new?DEBUG_NEW
#undef ?ESTE_FILE
static?char?ESTE_FILE[]? =?__FILE__;
#endif
/////////////// / ///////////////////////////////////////////////// ///// //////////
/?El?objeto?único?y?único?de?aplicación
usando?espacio de nombres?std ; p>
void?EnumIE(?void?);//enumerar funciones del navegador
void?EnumFrame(?IHTMLDocument2?*?pIHTMLDocument2?);?//Enumerar funciones de subtrama
void ?EnumForm(?IHTMLDocument2?*?pIHTMLDocument2?);?//enumerar funciones de formulario
int?_tmain(int?argc,?TCHAR*?argv[],?TCHAR*?envp[ ])
{
::CoInitialize(NULL);?//Inicializar apartamento COM
EnumIE();//enumerar navegador
: :CoUninitialize();?//Liberar el ?COM?apartamento
cout?<
getchar();//esperar el retorno de carro
return?0;
}
void?EnumIE( ?void? )
{
cout?<
CComPtr IShellWindows?>?spShellWin;
HRESULT?hr?=?spShellWin.CoCreateInstance(?CLSID_ ShellWindows?);
if?(?FAILED?(?hr?) ?)
{ cout?<
}
lon
g?nCount?=?0;?//?Obtener el número de instancias del navegador (Explorer? y?IExplorer)
spShellWin->get_Count(? &nCount?);
if (?0?==?nCount?)
{ cout?<
}
for(int?i=0;?i { CComPtr?spDispIE; hr= spShellWin->Item(CComVariant(? (largo) i?),? &spDispIE?); if(?FAILED?(?hr?)?) ?continuar; IWebBrowser2?>?spBrowser?=?spDispIE; ?IDispatch?>?spDispDoc; hr?=?spBrowser->get_Document(? &spDispDoc? ); if(? !spBrowser? )?); if(?FAILED?(?hr?)?)?continuar; ?>?spDocument2?=?spDispDoc; if(? !spDocument2?)?continue; //El programa se ha ejecutado hasta ahora y encontró el comentario que apunta a ?IHTMLDocument2? //Elimine el comentario en la siguiente línea de la declaración. y cambie el fondo del navegador para verlo //spDocument2->put_bgColor(?CComVariant(?" green"?) ?) ; EnumForm(?spDocument2?);?//enumerar todos los formularios } } void?EnumFrame(?IHTMLDocument2?*?pIHTMLDocument2?) { if ?(? !pIHTMLDocument2? )?return; HRESULT?hr; CComPtr?spFramesCollection2; pIHTMLDocument2->get_frames(? &spFramesCollection2?);?/ /obtener la colección de fotogramas long?nFrameCount=0;//obtener el número de subtramas hr?=?spFramesCollection2->get_length(? &nFrameCount?); p> si? (?FAILED?(?hr?)?|?0?==?nFrameCount?)?return; for(long?i=0;?i {CComVariant?vDispWin2;?// Obtener la interfaz de automatización de subtramas hr?=?spFramesCollection2->item(? & ;CComVariant(i),? &vDispWin2?); si?(?FAILED?(?hr?)?)?continuar; si(? !spWin2?)? continue;?//obtener la interfaz ?IHTMLWindow2? CComPtr??spDoc2; spWin2->get_document(? &spDoc2?);? Formulario de formulario. ) } } void?EnumForm(?IHTMLDocument2?*?pIHTMLDocument2?) { if(? !pIHTMLDocument2?)?return; EnumFrame(?pIHTMLDocument2?);?// Enumere recursivamente los marcos de subtrama en el IHTMLDocument2 actual" HRESULT?hr; CComBSTR?bstrTitle; pIHTMLDocument2->get_title(? &bstrTitle?);?//obtener el título del documento USES_CONVERSION; cout?< cout?< cout?< CComQIPtr?spElementCollection; hora? =?pIHTMLDocument2->get_forms(?&spElementCollection?);?//get_forms colección if(?FAILED(?hr?)?) { cout?< "¿Obteniendo colección para el formulario? IHTMLElementCollection? Error")? < } long? { cout?<< ?_T ("Error al obtener el número de formularios")? < } for(long?i=0;?i { IDispatch?*pDisp?=?NULL;?// Obtener el primer elemento ?i? del formulario hr?=?spElementCollection->item(?CComVariant(?i?),?CComVariant( ), ? &pDisp?); if(?FAILED(?hr?)?) ?continue; CComQIPtr?spFormElement?=?pDisp->Release(); hr?=?spFormElement->get_length(? &nElemCount? ); si?); if(?FAILED(?hr?)?) ?continuar; /p> CComDispatchDriver?spInputElement;?// Obtener el primer elemento j Campos de formulario hr?=?spFormElement->item(?CComVariant(?j?),?CComVariant(),?&spInputElement?); if(?FAILED(?hr) ?)?) ?continue; CComVariant?vName,vVal,vType;?// Obtener el ?Nombre, Valor, Tipo del campo del formulario; hr?=?spInputElement .GetPropertyByName (?L "nombre",? &vName?); if(?FAILED(?hr?)?) ?continue; hr?=?spInputElement.GetPropertyByName( ?L "valor",? &vVal?); if(?FAILED(?hr?)?) ?Continuar; hr?=?spInputElement.GetPropertyByName(?L " type" ,?&vType?); if(?FAILED(?hr?)?) Continuar; LPCTSTR?lpName?=?vName.bstrVal? OLE2CT(?vName. bstrVal? ) ?_T("NULL");?//Nombre de dominio desconocido LPCTSTR?lpVal?=?vVal.bstrVal? OLE2CT(?vVal.bstrVal?)? );? //Vacío, no ingresado LPCTSTR?lpType?=?vType.bstrVal? OLE2CT(?vType.bstrVal?)? :?_T("NULL");?//tipo desconocido cout?< cout?<submit(); } } } } p >