递归枚举IHTMLDocument2的所有元素

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

}

你可能感兴趣的:(document)