當前位置:編程學習大全網 - 編程語言 - 如何用VC編程實現瀏覽器版本的掃描

如何用VC編程實現瀏覽器版本的掃描

#include?"stdafx.h"

#include?"EnumFormVal.h"

#include?<atlbase.h>

CComModule?_Module;?//?由於要使用?CComDispatchDriver?ATL的智能指針,

//?所以聲明它是必須的

#include?<mshtml.h>?//?所有?IHTMLxxxx?的接口聲明

#include?<atlcom.h>

#ifdef?_DEBUG

#define?new?DEBUG_NEW

#undef?THIS_FILE

static?char?THIS_FILE[]?=?__FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

//?The?one?and?only?application?object

using?namespace?std;

void?EnumIE(?void?);//枚舉瀏覽器函數

void?EnumFrame(?IHTMLDocument2?*?pIHTMLDocument2?);?//枚舉子框架函數

void?EnumForm?(?IHTMLDocument2?*?pIHTMLDocument2?);?//枚舉表單函數

int?_tmain(int?argc,?TCHAR*?argv[],?TCHAR*?envp[])

{

::CoInitialize(NULL);?//初始化?COM?公寓

EnumIE();//枚舉瀏覽器

::CoUninitialize();?//釋放?COM?公寓

cout?<<?_T("======完成======")?<<?endl;

getchar();//等待回車

return?0;

}

void?EnumIE(?void?)

{

cout?<<?_T("開始掃描系統中正在運行的瀏覽器實例")?<<?endl;

CComPtr<?IShellWindows?>?spShellWin;

HRESULT?hr?=?spShellWin.CoCreateInstance(?CLSID_ShellWindows?);

if?(?FAILED?(?hr?)?)

{

cout?<<?_T("獲取?IShellWindows?接口錯誤")?<<?endl;

return;

}

long?nCount?=?0;?//?取得瀏覽器實例個數(Explorer?和?IExplorer)

spShellWin->get_Count(?&nCount?);

if(?0?==?nCount?)

{

cout?<<?_T("沒有在運行著的瀏覽器")?<<?endl;

return;

}

for(int?i=0;?i<nCount;?i++)

{

CComPtr<?IDispatch?>?spDispIE;

hr=spShellWin->Item(CComVariant(?(long)i?),?&spDispIE?);

if?(?FAILED?(?hr?)?)?continue;

CComQIPtr<?IWebBrowser2?>?spBrowser?=?spDispIE;

if?(?!spBrowser?)?continue;

CComPtr?<?IDispatch?>?spDispDoc;

hr?=?spBrowser->get_Document(?&spDispDoc?);

if?(?FAILED?(?hr?)?)?continue;

CComQIPtr<?IHTMLDocument2?>?spDocument2?=?spDispDoc;

if?(?!spDocument2?)?continue;

//?程序運行到此,已經找到了?IHTMLDocument2?的接口指針

//?刪除下行語句的註釋,把瀏覽器的背景改變看看

//?spDocument2->put_bgColor(?CComVariant(?"green"?)?);

EnumForm(?spDocument2?);?//枚舉所有的表單

}

}

void?EnumFrame(?IHTMLDocument2?*?pIHTMLDocument2?)

{

if?(?!pIHTMLDocument2?)?return;

HRESULT?hr;

CComPtr<?IHTMLFramesCollection2?>?spFramesCollection2;

pIHTMLDocument2->get_frames(?&spFramesCollection2?);?//取得框架frame的集合

long?nFrameCount=0;//取得子框架個數

hr?=?spFramesCollection2->get_length(?&nFrameCount?);

if?(?FAILED?(?hr?)?||?0?==?nFrameCount?)?return;

for(long?i=0;?i<nFrameCount;?i++)

{

CComVariant?vDispWin2;?//取得子框架的自動化接口

hr?=?spFramesCollection2->item(?&CComVariant(i),?&vDispWin2?);

if?(?FAILED?(?hr?)?)?continue;

CComQIPtr<?IHTMLWindow2?>?spWin2?=?vDispWin2.pdispVal;

if(?!spWin2?)?continue;?//取得子框架的?IHTMLWindow2?接口

CComPtr?<?IHTMLDocument2?>?spDoc2;

spWin2->get_document(?&spDoc2?);?//取得字框架的?IHTMLDocument2?接口

EnumForm(?spDoc2?);//遞歸枚舉當前子框架?IHTMLDocument2?上的表單form

}

}

void?EnumForm(?IHTMLDocument2?*?pIHTMLDocument2?)

{

if(?!pIHTMLDocument2?)?return;

EnumFrame(?pIHTMLDocument2?);?//遞歸枚舉當前?IHTMLDocument2?上的子框架fram

HRESULT?hr;

CComBSTR?bstrTitle;

pIHTMLDocument2->get_title(?&bstrTitle?);?//取得文檔標題

USES_CONVERSION;

cout?<<?_T("====================")?<<?endl;

cout?<<?_T("開始枚舉“")?<<?OLE2CT(?bstrTitle?)?<<?_T("”的表單")?<<?endl;

cout?<<?_T("====================")?<<?endl;

CComQIPtr<?IHTMLElementCollection?>?spElementCollection;

hr?=?pIHTMLDocument2->get_forms(?&spElementCollection?);?//取得表單集合

if?(?FAILED(?hr?)?)

{

cout?<<?_T("獲取表單的集合?IHTMLElementCollection?錯誤")?<<?endl;

return;

}

long?nFormCount=0;//取得表單數目

hr?=?spElementCollection->get_length(?&nFormCount?);

if?(?FAILED(?hr?)?)

{

cout?<<?_T("獲取表單數目錯誤")?<<?endl;

return;

}

for(long?i=0;?i<nFormCount;?i++)

{

IDispatch?*pDisp?=?NULL;?//取得第?i?項表單

hr?=?spElementCollection->item(?CComVariant(?i?),?CComVariant(),?&pDisp?);

if?(?FAILED(?hr?)?)?continue;

CComQIPtr<?IHTMLFormElement?>?spFormElement?=?pDisp;

pDisp->Release();

long?nElemCount=0;//取得表單中?域?的數目

hr?=?spFormElement->get_length(?&nElemCount?);

if?(?FAILED(?hr?)?)?continue;

for(long?j=0;?j<nElemCount;?j++)

{

CComDispatchDriver?spInputElement;?//取得第?j?項表單域

hr?=?spFormElement->item(?CComVariant(?j?),?CComVariant(),?&spInputElement?);

if?(?FAILED(?hr?)?)?continue;

CComVariant?vName,vVal,vType;?//取得表單域的?名,值,類型

hr?=?spInputElement.GetPropertyByName(?L"name",?&vName?);

if(?FAILED(?hr?)?)?continue;

hr?=?spInputElement.GetPropertyByName(?L"value",?&vVal?);

if(?FAILED(?hr?)?)?continue;

hr?=?spInputElement.GetPropertyByName(?L"type",?&vType?);

if(?FAILED(?hr?)?)?continue;

LPCTSTR?lpName?=?vName.bstrVal?

OLE2CT(?vName.bstrVal?)?:?_T("NULL");?//未知域名

LPCTSTR?lpVal?=?vVal.bstrVal?

OLE2CT(?vVal.bstrVal?)?:?_T("NULL");?//空值,未輸入

LPCTSTR?lpType?=?vType.bstrVal?

OLE2CT(?vType.bstrVal?)?:?_T("NULL");?//未知類型

cout?<<?_T("[")?<<?lpType?<<?_T("]?");

cout?<<?lpName?<<?_T("?=?")?<<?lpVal?<<?endl;

}

//想提交這個表單嗎?刪除下面語句的註釋吧

//pForm->submit();

}

}

  • 上一篇:RS485兩線制通信方式中,正常情況下兩線之間電壓是多少伏?
  • 下一篇:熱愛編程
  • copyright 2024編程學習大全網