как справиться с плохими указателями - PullRequest
0 голосов
/ 16 июня 2011

все, поскольку заголовок спросил, как обращаться с плохими указателями.Я использую 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*)&param);
    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&amp;tab=1&amp;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 для таблицы стилей.

Ответы [ 2 ]

1 голос
/ 18 июня 2011

проблема вызвана использованием интеллектуальных указателей на IHTMLDocument2, IHTMLElement и IHTMLElementCollection и IHTMLStyle. Я решил проблему плохих указателей, объявив на них нормальные указатели, и не знаю, почему умные указатели подвели меня на этот раз, и, похоже, тоже не удалось в некоторых других местах.

1 голос
/ 16 июня 2011

Я понятия не имею, что это за материал MSHTML, но я предполагаю, pChElem->style не является указателем.

В этом случае вы назначаете стиль значение для стиля указатель , что, безусловно, будет плохим указателем.Я бы рекомендовал сначала разыменовывать ссылки, за исключением того, что вы не выделяете ни один из этих указателей, поэтому, если вы не хотите просто использовать стиль элемента, возможно, вам нужно что-то вроде этого:

pStyle = &pChElem->style;

Редактировать: Также провел небольшое исследование моего собственного любопытства по поводу этих интерфейсов, и я считаю, что item возвращает HRESULT не элемент из того, что я вижу http://msdn.microsoft.com/en-us/library/aa703930(v=vs.85).aspx, если вы не завернули егоили я что-то упускаю с первого взгляда.

...