如何处理坏指针

时间:2011-06-16 14:55:44

标签: c++ html visual-c++ mshtml

所有,因为标题询问如何处理坏指针。我正在使用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”等,它们不包含任何样式;所以

pStyle-&GT; fontStyle; pStyle-&gt; fontFamily和 pStyle-&GT; 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 个答案:

答案 0 :(得分:1)

我不知道这个MSHTML是什么,但我猜测pChElem->style不是指针。

在这种情况下,您将样式分配给样式指针,这肯定是一个错误的指针。我建议先取消引用,除非你没有分配任何这些指针,所以如果你不想只使用元素的样式,也许这就是你要找的东西:

pStyle = &pChElem->style;

编辑:我也对自己对这些界面的好奇心进行了一些研究,我相信item会返回HRESULT而不是我所看到的http://msdn.microsoft.com/en-us/library/aa703930(v=vs.85).aspx元素除非你包裹它,否则我乍一看就会遗漏一些东西。

答案 1 :(得分:1)

问题是由IHTMLDocument2IHTMLElementIHTMLElementCollection以及IHTMLStyle上的智能指针引起的。我通过在它们上声明正常指针解决了坏指针问题,并且不知道为什么智能指针这次失败了,而且在其他一些地方似乎也失败了。