日期:2014-05-16  浏览次数:21020 次

当IHTMLTxtRange::findText Method查找不到字符串的时候

/*程序中的源码*/

HRESULT    CContentBehavior::InternalFindTextImpl(CComBSTR bstrText, DWORD dwFlag, BOOL  bSelected, DWORD *dwRet, BOOL bReplaceFind)
{
 if( dwRet)
  *dwRet =0;

 CStringW strText(bstrText);
 BOOL bBlankExists= strText.Find(L' ') >=0;


 FXE::CXMLPointerUtil tools(this); 
 CComPtr<IMarkupPointer> pStart, pEnd, pEndConst;

 tools.GetSelectedPointer(&pStart, &pEnd, NULL);

 if ( (pStart == NULL) || (pEnd == NULL))
  return E_FAIL;

 BOOL bAreEqual  = FALSE;
 pStart->IsEqualTo(pEnd, &bAreEqual);

 CComPtr<IHTMLElement> pElem;
 GetContentElement(&pElem);
 ASSERT(pElem);

 long nStep = 1L;
 MARKUP_CONTEXT_TYPE type = CONTEXT_TYPE_Text;

    long nCount = bstrText.Length();
 DWORD dwFlagTmp = dwFlag;
 if( dwFlag & FR_DOWN)
 {
  pEnd->MoveAdjacentToElement(pElem,  ELEM_ADJ_BeforeEnd );
  if( dwFlag & FR_LOOPFIND)
   pStart->MoveAdjacentToElement(pElem, ELEM_ADJ_AfterBegin);


   if((!bAreEqual)&&(!bReplaceFind))
      pStart->Right(TRUE, &type, NULL, &nCount, NULL);
 }
 else
 { //替换的时候,调用查找函数,是永远不会进入该else的。
  pStart->MoveAdjacentToElement(pElem, ELEM_ADJ_AfterBegin);
  if( dwFlag & FR_LOOPFIND)
   pEnd->MoveAdjacentToElement(pElem,  ELEM_ADJ_BeforeEnd );

  
   if((!bAreEqual)&&(!bReplaceFind))
      pEnd->Left(TRUE, &type, NULL, &nCount, NULL);
  nCount = -nCount;
 }

 
 dwFlag &= (~FR_DOWN);
 dwFlag &= (~FR_LOOPFIND);

    CComPtr<IHTMLDocument2> spDoc;
 GetHTMLDocument(&spDoc);
 if( spDoc == NULL)
  return E_FAIL;
 CComPtr<IHTMLElement> spBodyElement; 
 spDoc->get_body(&spBodyElement);
 ASSERT(spBodyElement);

 CComQIPtr<IHTMLBodyElement> spBody(spBodyElement);
 CComPtr<IHTMLTxtRange> spRange;
 spBody->createTextRange(&spRange);
 ASSERT(spRange);

 //选中范围
 CComQIPtr<IMarkupServices> pServices(spDoc); 

 pServices->CreateMarkupPointer(&pEndConst);
 pEndConst->MoveToPointer(pEnd);

 pServices->MoveRangeToPointers(pStart,pEnd,spRange);
 ASSERT(spRange);


 {
  VARIANT_BOOL   bRet = VARIANT_FALSE;
  HRESULT hr = spRange->findText( bstrText, nCount, dwFlag, &bRet);  //没有查找到并不代表spRange中真的没有bstrText这个字符串


  
  CComBSTR bstrTextR;
  spRange->get_text(&bstrTextR);
  
  CStringW strTextR(bstrTextR);
  
  CStringW strSearch(bstrText);
  strTextR.Replace(L"\r\n",L"\r");//避免换行导致的误差
  
  int n = -1;
  if (!(dwFlag & FR_MATCHCASE))
  {
   strTextR.MakeLower();
   strSearch.MakeLower();
  }

  if (dwFlagTmp & FR_DOWN)
  {
   n = strTextR.Find(strSearch);
  }
  else
  {
   std::wstring stdstrTextR = strTextR.GetBuffer(0);
   n = stdstrTextR.rfind(strSearch.GetBuffer(0));<