все, поскольку заголовок спросил, как обращаться с плохими указателями.Я использую MSHTML :: IHTMLStyle для обработки функций стилей, которые, когда я читаю фрагмент кода html, собирают некоторые специфические функции стилей среди всех элементов html в коде.
hash_map<wstring, wstring> CMyAppDlg::GetNodeStyles(VARIANT varSrc)
{
long lLength = 0;
MSHTML::IHTMLDocument2Ptr htmDoc = NULL;
MSHTML::IHTMLElementCollectionPtr pElemColl = NULL;
MSHTML::IHTMLElementPtr pChElem = NULL;
MSHTML::IHTMLStylePtr pStyle = NULL;
_bstr_t bstrtTagName;
hash_map<wstring, wstring> hmStyles;
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (void**) &htmDoc);
VARIANT *param;
HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
param->vt = VT_BSTR;
param->bstrVal = varSrc.bstrVal;
hr = SafeArrayUnaccessData(psaStrings);
hr = htmDoc->write(psaStrings);
pElemColl = htmDoc->all;
lLength = pElemColl->length;
for(long i = 0; i < lLength; i++)
{
pChElem = pElemColl->item(_variant_t(i), _variant_t());
MessageBox(pChElem->tagName, _T("The tag name of this html element is"), MB_OK);
pStyle = pChElem->style;
pStyle->fontStyle;
hmStyles[wstring(pStyle->fontStyle)] = L"FontStyle";
hmStyles[wstring(pStyle->fontFamily)] = L"FontFamily";
hmStyles[wstring(pStyle->textDecoration)] = L"TextDecoration";
}
return hmStyles;
}
проблема заключается в том, что при чтении в произвольном HTML-коде, например:
<A href='/servlet/BookDetailsPL?bi=1257056972&tab=1&searchurl=bt.x%3D44%26bt.y%3D10%26sts%3Dt%26tn%3Dharry%2Bpotter' cmImpressionSent='1'>The Orchard Bookshop.</A> <SPAN class=scndInfo>(Hayes., UK, United Kingdom)</SPAN>
IHTMLDocument write () автоматически добавляет простые "HTML", "TITLE", "HEAD",«BODY» и т. Д. К коду, чтобы они не содержали никаких стилей;so
pStyle-> fontStyle;pStyle-> fontFamily и pStyle-> textDecoration будут возвращать плохие указатели типа _bstr_t, которые эти плохие указатели приводят к сбою моей программы.Мой вопрос заключается в том, как избежать этих плохих указателей, например, установить условие для их обхода.
MSHTML::IHTMLStyle::GetfontStyle returned {<Bad Ptr> (1)} _bstr_t
MSHTML::IHTMLStyle::GetfontFamily returned {<Bad Ptr> (1)} _bstr_t
MSHTML::IHTMLStyle::GettextDecoration returned {<Bad Ptr> (1)} _bstr_t
вот документация по свойству стиля IHTMLElement:
HRESULT IHTMLElement :: get_style (IHTMLStyle ** p);
p - это адрес указателя на интерфейс IHTMLStyle для таблицы стилей.