IHTMLTxtRange::findText後に落ちてしまう

解決


yonez  2006-05-13 06:34:04  No: 61791

http://www.codeproject.com/miscctrl/chtmlview_search.asp
上記のコードプロジェクトのソースについてお聞きしたいことがあります。
CHtmlView内で単語を検索して反転表示させるというものなのですが、
デバッグ版ではとくに問題は無いのですけど、リリース版では落ちるよう
になってしまいました(いつの時点からかわからないのですが…)

問題箇所のソースです
=======================================================
void CCHtmlView_SearchView::FindText(CString searchText, long lFlags /* =2 */, BOOL bNNF /* =FALSE  (for internal use)*/)
{
  static CString sLastSearch;
  static BSTR lastBookmark = NULL;

  if(sLastSearch != searchText)
    lastBookmark = NULL;
  sLastSearch = searchText;
  

  IHTMLDocument2 *lpHtmlDocument = NULL;
  LPDISPATCH lpDispatch = NULL;
  lpDispatch = GetHtmlDocument();
  ASSERT(lpDispatch);

  lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
  ASSERT(lpHtmlDocument);

  lpDispatch->Release();

  IHTMLElement *lpBodyElm;
  IHTMLBodyElement *lpBody;
  IHTMLTxtRange *lpTxtRange;

  lpHtmlDocument->get_body(&lpBodyElm);
  ASSERT(lpBodyElm);
  lpHtmlDocument->Release();
  lpBodyElm->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody);
  ASSERT(lpBody);
  lpBodyElm->Release();
  lpBody->createTextRange(&lpTxtRange);
  ASSERT(lpTxtRange);
  lpBody->Release();

  CComBSTR search(searchText.GetLength()+1,(LPCTSTR)searchText);
  bool bFound,bTest;
  long t;

  if(lastBookmark!=NULL)
  {
    lpTxtRange->moveToBookmark(lastBookmark,(VARIANT_BOOL*)&bTest);
    if(!bTest)
    {
      lastBookmark=NULL;
      lpTxtRange->moveStart((BSTR)CComBSTR("Textedit"),1,&t);
      lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
    } else
    {
      lpTxtRange->moveStart((BSTR)CComBSTR("Character"),1,&t);
      lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
    }
  } else
  {
    lpTxtRange->moveStart((BSTR)CComBSTR("Textedit"),0,&t);
    lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
  }
  lpTxtRange->findText((BSTR)search,0,lFlags,(VARIANT_BOOL*)&bFound);   // ←問題箇所

  if(!bFound)
  {
    if(lastBookmark==NULL && !bNNF)
    {
      CString message;
      message.Format("Cannot find the string: '%s'",searchText);
      AfxMessageBox(message);
    } else if(lastBookmark!=NULL)
    {
      lastBookmark = NULL;
      FindText(searchText,lFlags,TRUE);
    }
  } else
  {
    // ↓ここで落ちています
    if(lpTxtRange->getBookmark(&lastBookmark)!=S_OK)
      lastBookmark=NULL;
    lpTxtRange->select();
    lpTxtRange->scrollIntoView(TRUE);
  }

  lpTxtRange->Release();
}
=======================================================

メッセージボックスなどを出して調べてみましたら、
lpTxtRange->findText後にlpTxtRangeのアクセスを行うと落ちている
ようでした。以前はこのようなことは無かった気がしたんですが…
この処理自体どこか間違っているのでしょうか?

識者の方々、どうか御教授よろしくお願いします。
(環境 VC++6.0 SP6 Windows XP SP2 MFC使用)


yonez  2006-05-13 06:40:20  No: 61792

すみません、コードプロジェクトの下の掲示板に書いてありました。
bool bFound → VARIANT_BOOL bFound
で解決しました。
お騒がせしました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加