- #include <atlbase.h> //atl
- #include <atlcom.h>
- #include <mshtml.h> //所有的IHTMLXXX的借口声明
- #include <iostream>
- #include <exdisp.h>
- using namespace std;
- CComModule _Module; //由于要使用 CComDispatchDriver ATL的智能指针,所以声明它是必须的
- void EnumIE(); //枚举浏览器函数
- void EnumFrame(IHTMLDocument2* pDoc); //枚举子框架函数
- void EnumForm(IHTMLDocument2* pDoc); //枚举表单函数
- int main()
- {
- ::CoInitialize(NULL);
- ::EnumIE();
- ::CoUninitialize();
- return 0;
- }
- void EnumIE()
- {
- CComPtr<IShellWindows> spShellWin;
- HRESULT hr = S_FALSE;
- long nCount = 0;
- long i = 0;
- cout << "开始遍历系统中正在运行的IE实例" << endl;
- hr = spShellWin.CoCreateInstance(CLSID_ShellWindows);
- if (FAILED(hr))
- {
- cout << "获取IShellWindows接口错误!" << endl;
- return;
- }
- spShellWin->get_Count(&nCount);
- if (nCount <= 0)
- {
- cout << "没有正在运行的浏览器!" << endl;
- return;
- }
- for (i = 0; i < nCount; i++)
- {
- CComPtr<IDispatch> spIe;
- hr = spShellWin->Item(CComVariant((long)i), &spIe);
- if (FAILED(hr))
- {
- continue;
- }
- CComQIPtr<IWebBrowser2> spBrowser = spIe;
- if (!spBrowser)
- {
- continue;
- }
- CComPtr<IDispatch> spDisp;
- hr = spBrowser->get_Document(&spDisp);
- if (FAILED(hr))
- {
- continue;
- }
- CComQIPtr<IHTMLDocument2> spDoc = spDisp;
- if (!spDoc)
- {
- continue;
- }
- spDoc->put_bgColor(CComVariant("blue"));
- ::EnumForm(spDoc);
- }
- }
- void EnumFrame(IHTMLDocument2* pDoc)
- {
- HRESULT hr = S_FALSE;
- long nCount = 0;
- long i = 0;
- if (!pDoc)
- {
- return;
- }
- CComPtr<IHTMLFramesCollection2> spCollFrm;
- pDoc->get_frames(&spCollFrm);
- hr = spCollFrm->get_length(&nCount);
- if (FAILED(hr) || (nCount <= 0))
- {
- return;
- }
- for (i = 0; i < nCount; i++)
- {
- CComVariant vt;
- hr = spCollFrm->item(&CComVariant(i), &vt);
- if (FAILED(hr))
- {
- continue;
- }
- CComQIPtr<IHTMLWindow2> spWin2 = vt.pdispVal;
- if (!spWin2)
- {
- continue;
- }
- CComPtr<IHTMLDocument2> spDoc2;
- spWin2->get_document(&spDoc2);
- ::EnumForm(spDoc2);
- }
- }
- void EnumForm(IHTMLDocument2* pDoc)
- {
- HRESULT hr = S_FALSE;
- CComBSTR bstrTitle;
- long nCount = 0;
- long i = 0;
- if (!pDoc)
- {
- return;
- }
- pDoc->get_title(&bstrTitle);
- USES_CONVERSION;
- cout << "开始枚举 " << OLE2CT(bstrTitle) << " 的表单" << endl;
- CComQIPtr<IHTMLElementCollection> spCollElm;
- hr = pDoc->get_forms(&spCollElm);
- if (FAILED(hr))
- {
- cout << "获取表单集合错误!" << endl;
- return;
- }
- hr = spCollElm->get_length(&nCount);
- if (FAILED(hr))
- {
- cout << "获取表单输入错误!" << endl;
- return;
- }
- for (i = 0; i < nCount; i++)
- {
- IDispatch* pDisp = NULL;
- hr = spCollElm->item(CComVariant(i), CComVariant(), &pDisp);
- if (FAILED(hr))
- {
- continue;
- }
- CComQIPtr<IHTMLFormElement> spEle = pDisp;
- pDisp->Release();
- long nElemCount = 0;
- long j = 0;
- hr = spEle->get_length(&nElemCount);
- if (FAILED(hr))
- {
- continue;
- }
- for (j = 0; j < nElemCount; j++)
- {
- CComDispatchDriver spInputElem;
- hr = spEle->item(CComVariant(j), CComVariant(), &spInputElem);
- if (FAILED(hr))
- {
- continue;
- }
- CComVariant vName, vVal, vType;
- hr = spInputElem.GetPropertyByName(L"name", &vName);
- if (FAILED(hr))
- {
- continue;
- }
- hr = spInputElem.GetPropertyByName(L"value", &vVal);
- if (FAILED(hr))
- {
- continue;
- }
- hr = spInputElem.GetPropertyByName(L"type", &vType);
- if (FAILED(hr))
- {
- continue;
- }
- LPCTSTR lpName = vName.bstrVal ? OLE2CT(vName.bstrVal) : "NULL";
- LPCTSTR lpVal = vVal.bstrVal ? OLE2CT(vVal.bstrVal) : "NULL";
- LPCTSTR lpType = vVal.bstrVal ? OLE2CT(vType.bstrVal) : "NULL";
- cout << "[" << lpType << "] " << lpName << " = " << lpVal << endl;
- }
- }
- }
遍历ie元素

