所有,因为标题询问如何处理坏指针。我正在使用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”等,它们不包含任何样式;所以
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接口指针的地址。
答案 0 :(得分:1)
我不知道这个MSHTML是什么,但我猜测pChElem->style
不是指针。
在这种情况下,您将样式值分配给样式指针,这肯定是一个错误的指针。我建议先取消引用,除非你没有分配任何这些指针,所以如果你不想只使用元素的样式,也许这就是你要找的东西:
pStyle = &pChElem->style;
编辑:我也对自己对这些界面的好奇心进行了一些研究,我相信item
会返回HRESULT
而不是我所看到的http://msdn.microsoft.com/en-us/library/aa703930(v=vs.85).aspx元素除非你包裹它,否则我乍一看就会遗漏一些东西。
答案 1 :(得分:1)
问题是由IHTMLDocument2
,IHTMLElement
和IHTMLElementCollection
以及IHTMLStyle
上的智能指针引起的。我通过在它们上声明正常指针解决了坏指针问题,并且不知道为什么智能指针这次失败了,而且在其他一些地方似乎也失败了。