#include? < stdio.h >
#include?
< tchar.h >
#include
< iostream >
#include
< exdisp.h >
#include?
< atlbase.h > ??
#include?
< atlcom.h >
#include
< mshtml.h >

using ? namespace ?std;

void ?EnumIE(? void ?);
void ?EnumFrame(?IHTMLDocument2? * ?pIHTMLDocument2?);?
void ?EnumForm?(?IHTMLDocument2? * ?pIHTMLDocument2?);?



int ?_tmain( int ?argc,?_TCHAR * ?argv[])
{
????wcout.imbue(locale(
" chs " ));?

????::CoInitialize(NULL);???
// 初始化COM?
???
????EnumIE();???????????????
// 枚舉瀏覽器????
???
????::CoUninitialize();?????
// 釋放COM
???
????wcout
<< _T( " ======完成====== " ) << endl;???
????getchar();??????????????
// 等待回車????
???
????
return ? 0 ;??

}


void ?EnumIE(? void ?)???
{???
????wcout
<< _T( " 開始掃描系統中正在運行的瀏覽器實例 " ) << endl;???
???
????CComPtr
< IShellWindows > ?spShellWin;???
????HRESULT?hr?
= ?spShellWin.CoCreateInstance(?CLSID_ShellWindows?);???
????
if ?(?FAILED?(?hr?)?)???
????
{???
????????wcout?
<< _T( " 獲取?IShellWindows?接口錯誤 " ) << endl;???
????????
return ;???
????}
???
???
????
long ?nCount? = ? 0 ;???????? // ?取得瀏覽器實例個數(Explorer?和?IExplorer)????
????spShellWin -> get_Count(? & nCount?);???
????
if (? 0 ? == ?nCount?)???
????
{???
????????wcout
<< _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?); // 取得子框架的自動化接口"?vDispWin2;?CComVariant???
???????? 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;???
????wcout?
<< ?_T( " ==================== " )? << ?endl;???
????wcout?
<< ?_T( " 開始枚舉“ " )? << ?OLE2CT(?bstrTitle?)? << ?_T( " ”的表單 " )? << ?endl;???
????wcout?
<< ?_T( " ==================== " )? << ?endl;???
???
????CComQIPtr
< ?IHTMLElementCollection? > ?spElementCollection;???
????hr?
= ?pIHTMLDocument2 -> get_forms(? & spElementCollection?);? // 取得表單集合????
???? if ?(?FAILED(?hr?)?)???
????
{???
????????wcout?
<< ?_T( " 獲取表單的集合?IHTMLElementCollection?錯誤 " )? << ?endl;???
????????
return ;???
????}
???
???
????
long ?nFormCount = 0 ;?????????????? // 取得表單數目????
????hr? = ?spElementCollection -> get_length(? & nFormCount?);???
????
if ?(?FAILED(?hr?)?)???
????
{???
????????wcout?
<< ?_T( " 獲取表單數目錯誤 " )? << ?endl;???
????????
return ;???
????}
???
???????
????
for ( long ?i = 0 ;?i < nFormCount;??i ++ ) // ""?項表單?i?取得第?;
???? {
????
????????IDispatch??
* pDisp = NULL;
?????????hr
= ?spElementCollection -> item(?CComVariant(?i?),?CComVariant(i),? & 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 " );??? // 未知類型????
???
????????????wcout?
<< ?_T( " [ " )? << ?lpType? << ?_T( " ]? " );???
????????????wcout?
<< ?lpName? << ?_T( " ?=? " )? << ?lpVal? << ?endl;???
????????}
???
????????
// 想提交這個表單嗎?刪除下面語句的注釋吧????
????????
// pForm->submit();????
????}
???
}