void EnumHTMLDocument( MSHTML::IHTMLDocument2* pDoc ) { if( pDoc == NULL )return; //遍历搜索子框架,递归处理子框架的文档 CComPtr<MSHTML::IHTMLFramesCollection2> spFramesCollection; pDoc->get_frames( &spFramesCollection ); long lCount = 0; HRESULT hr = spFramesCollection->get_length( &lCount ); if( FAILED( hr ) )return; for ( long lIndex = 0; lIndex < lCount; lIndex++ ) { CComVariant vDispWin; vDispWin = spFramesCollection->item( &CComVariant( lIndex ) ); CComQIPtr<MSHTML::IHTMLWindow2> spWin = vDispWin.pdispVal; if( spWin == NULL )continue; CComPtr<MSHTML::IHTMLDocument2> spSubDoc; spWin->get_document( &spSubDoc ); EnumHTMLDocument( spSubDoc ); } CComQIPtr<MSHTML::IHTMLElementCollection> spElementCollection; hr = pDoc->get_forms( &spElementCollection ); if( FAILED( hr ) )return; long lFormCount = 0; hr = spElementCollection->get_length( &lFormCount ); if( FAILED( hr ) )return; for ( long lIndex = 0; lIndex < lFormCount; lIndex++ ) { CComQIPtr<MSHTML::IHTMLFormElement> spFormElement = spElementCollection->item( &CComVariant( lIndex ) ); if( spFormElement == NULL )continue; long lElemCount = 0; hr = spFormElement->get_length( &lElemCount ); if( FAILED( hr ) )continue; for ( long lElemIndex = 0; lElemIndex < lElemCount; lElemIndex++ ) { CComDispatchDriver spInputElement; spInputElement = spFormElement->item( &CComVariant( lElemIndex ) ); if( spInputElement == NULL )continue; CComVariant varName, varValue, varType; hr = spInputElement.GetPropertyByName( L"name", &varName ); if( SUCCEEDED( hr ) ) { LPCTSTR lpszName = varName.bstrVal ? COLE2CT( varName.bstrVal ) : _T("NULL"); AtlMessageBox( NULL, lpszName ); } hr = spInputElement.GetPropertyByName( L"value", &varValue ); if( SUCCEEDED( hr ) ) { LPCTSTR lpszValue = varValue.bstrVal ? COLE2CT( varValue.bstrVal ) : _T("NULL"); AtlMessageBox( NULL, lpszValue ); } hr = spInputElement.GetPropertyByName( L"type", &varType ); if( SUCCEEDED( hr ) ) { LPCTSTR lpszType = varType.bstrVal ? COLE2CT( varType.bstrVal ) : _T("NULL"); AtlMessageBox( NULL, lpszType ); } } } }