проблема такая:
когда искомый текст (search) содержится в lpWorkRange не разделенный тегами — все нормально, но если искомый текст разделен тегами, то findText возвращает VARIANT_FALSE.
пример: если search=="123456", lppTxtRange->get_htmlText возвращает "!!!123456 <b>123</b>456!!!" и lppTxtRange->get_text возвращает "!!!123456 123456!!!"
тогда первое вхождение найдется, а второе нет, потому что оно разделено тегами.
проблема воспроизводится только в ИЕ8 без включенного Compatibility mode.
если в ИЕ8 включить Compatibility mode, то все работает отлично даже со словами разделенными тегами!
так же замечено, что если из начала документа убрать <!DOCTYPE HTML>, то все начинает работать нормально.
код такой:
CComBSTR search = search_context;
CComPtr<IHTMLTxtRange> lpWorkRange;
lppTxtRange->duplicate(&lpWorkRange);
long t;
lpWorkRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
const LONG mask = 0;
VARIANT_BOOL bFound = VARIANT_TRUE;
HRESULT hr = lpWorkRange->findText(search, 0, mask, &bFound);
while(SUCCEEDED(hr) && bFound==VARIANT_TRUE)
{
//двигаем начало рейнджа, в котором будем искать в следующий раз на конец рейнджа замены
if (!SUCCEEDED(lppTxtRange->setEndPoint((BSTR)CComBSTR(_T("StartToEnd")), lpWorkRange)))
{
ATLTRACE(_T("could not setEndPoint! \r\n"));
break;
}
lpWorkRange->pasteHTML(_T("<b>Repaced Text</b>"));
hr = lpWorkRange->findText(search, 0, mask, &bFound);
}
проблема решена, на данный момент это баг в IE8 и они его подтвердили. придется искать ручками.