#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();}
}