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使用)
すみません、コードプロジェクトの下の掲示板に書いてありました。
bool bFound → VARIANT_BOOL bFound
で解決しました。
お騒がせしました!
ツイート | ![]() |