본문 바로가기
IT-개발,DB

[개발/MFC] 웹 페이지 <form 태그의 a 태그 anchor 값 찾기

by SB리치퍼슨 2011. 9. 27.

// 웹 페이지 <form 태그의 a 태그 anchor 값 찾기


bool CMyInternetExplorer::FindAnchor (bool bClick, bool bFocus,
      bool bName, bool bOuterText, bool bTooltip, bool bURL,
      LPCTSTR sName, LPCTSTR sOuterText, LPCTSTR sTooltip, LPCTSTR sURL)
{
    ASSERT (m_pWebBrowser != NULL);
    if (m_pWebBrowser == NULL)
        return false;
    
    HRESULT hr;
    IDispatch* pHtmlDocDispatch = NULL;
    IHTMLDocument2 * pHtmlDoc = NULL;
    bool bSearch = true;

    // Retrieve the document object.

    hr = m_pWebBrowser->get_Document (&pHtmlDocDispatch);
    if (SUCCEEDED (hr) && (pHtmlDocDispatch != NULL))
    {
        hr = pHtmlDocDispatch->QueryInterface 
            (IID_IHTMLDocument2,  (void**)&pHtmlDoc);
        if (SUCCEEDED (hr) && (pHtmlDoc != NULL))
        {
            IHTMLElementCollection* pColl = NULL;
            hr = pHtmlDoc->get_all (&pColl);

            if (SUCCEEDED (hr) && (pColl != NULL))
            {
                // Obtained the Anchor Collection...

                long nLength = 0;
                pColl->get_length (&nLength);
                
                for (int i = 0; i < nLength && bSearch; i++)
                {
                    COleVariant vIdx ((long)i, VT_I4);
                    
                    IDispatch* pElemDispatch = NULL;
                    IHTMLElement * pElem = NULL;
                    
                    hr = pColl->item (vIdx, vIdx, &pElemDispatch);
                    
                    if (SUCCEEDED (hr) && 
                                 (pElemDispatch != NULL))
                    {
                        hr = pElemDispatch->QueryInterface 
                           (IID_IHTMLElement, (void**)&pElem);
                        
                        if (SUCCEEDED (hr) && (pElem != NULL))
                        {
                            BSTR bstrTagName;
                            CString sTempTagName;
                            if (!FAILED (pElem->get_tagName 
                                                 (&bstrTagName)))
                            {
                                sTempTagName = bstrTagName;
                                SysFreeString (bstrTagName);
                            }
                            
                            if (sTempTagName == _T ("a") || 
                                        sTempTagName == _T ("A"))
                            {
                                IHTMLAnchorElement * pAnchor = NULL;
                                hr = pElemDispatch->QueryInterface
                                   (IID_IHTMLAnchorElement, 
                                   (void**)&pAnchor);
                                
                                if (SUCCEEDED (hr) && 
                                               (pAnchor != NULL))
                                {
                                    BSTR bstrName, bstrOuterText, 
                                                 bstrURL, bstrTooltip;
                                    CString sTempName, sTempOuter, 
                                                sTempURL, sTempTooltip;
                                    
                                    if (!FAILED (pElem->get_outerText 
                                                      (&bstrOuterText)))
                                    {
                                        sTempOuter = bstrOuterText;
                                        SysFreeString (bstrOuterText);
                                    }
                                    if (!FAILED 
                                      (pElem->get_title 
                                      (&bstrTooltip)))
                                    {
                                        sTempTooltip = bstrTooltip;
                                        SysFreeString (bstrTooltip);
                                    }
                                    if 
                                      (!FAILED (pAnchor->get_name 
                                      (&bstrName)))
                                    {
                                        sTempName = bstrName;
                                        SysFreeString (bstrName);
                                    }
                                    if (!FAILED (pAnchor->get_href 
                                       (&bstrURL)))
                                    {
                                        sTempURL = bstrURL;
                                        SysFreeString (bstrURL);
                                    }

                                    // Do the comparison here!

                                    bool bMatches = true;
                                    if (bMatches && bName)
                                    {
                                      if 
                                      (!StringHelper::WildcardCompareNoCase 
                                      (sName, sTempName))
                                            bMatches = false;
                                    }
                                    if (bMatches && bOuterText)
                                    {
                                      if 
                                       (!StringHelper::WildcardCompareNoCase
                                       (sOuterText, sTempOuter))
                                            bMatches = false;
                                    }
                                    if (bMatches && bURL)
                                    {
                                      if
                                       (!StringHelper::WildcardCompareNoCase
                                       (sURL, sTempURL))
                                            bMatches = false;
                                    }
                                    if (bMatches && bTooltip)
                                    {
                                      if 
                                      (!StringHelper::WildcardCompareNoCase 
                                        (sTooltip, sTempTooltip))
                                            bMatches = false;
                                    }
                                    
                                    if (bMatches)
                                    {
                                        // No need to search more!

                                        bSearch = false;
                                        
                                        if (bFocus)
                                            pAnchor->focus ();
                                        if (bClick)
                                            pElem->click ();
                                    }
                                    pAnchor->Release ();
                                }
                            }
                            pElem->Release ();
                        }
                        pElemDispatch->Release ();
                    }        
                }
                pColl->Release ();
            }
            pHtmlDoc->Release();
        }
        pHtmlDocDispatch->Release ();
    }
    
    if (bSearch == false)
        return true;

    return false;
}
반응형

댓글