#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();????
????}
???
}
|
|
隨筆:64
文章:15
評論:65
引用:0
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
留言簿(14)
隨筆分類
隨筆檔案
收藏夾
最新隨筆
最新評論

閱讀排行榜
|
|