【发布时间】:2008-12-11 07:35:24
【问题描述】:
全部,
这是我的代码
//declare string pointer
BSTR markup;
//initialize markup to some well formed XML <-
//declare and initialize XML Document
MSXML2::IXMLDOMDocument2Ptr pXMLDoc;
HRESULT hr;
hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
pXMLDoc->async = VARIANT_FALSE;
pXMLDoc->validateOnParse = VARIANT_TRUE;
pXMLDoc->preserveWhiteSpace = VARIANT_TRUE;
//load markup into XML document
vtBoolResult = pXMLDoc->loadXML(markup);
//do some changes to the XML file<-
//get back string from XML doc
markup = pXMLDoc->Getxml(); //<-- this retrieves RUBBISH
此时我的字符串被弄乱了(开头只有几个汉字,然后是垃圾)。看起来像是编码问题。
我还尝试了以下方法:
_bstr_t superMarkup = _bstr_t(markup);
//did my stuff
superMarkup = pXMLDoc->Getxml();
markup = superMarkup;
但我仍然得到相同的结果。
即使我调用 GetXML() 而不更改 xml 文档中的任何内容,我仍然会得到垃圾。
此时,如果我尝试将损坏的指针分配给另一个指针,它将引发错误:
尝试恢复写保护 记忆。这通常是一个迹象 其他内存已损坏。
有什么建议吗?
编辑1:
我发现这与 XML 字符串的大小有关。 如果它发生在给定的 XML 字符串上并且我减小了大小(保持相同的模式),它将正常工作。看起来 MSXML2::DOMDocument40 对大小有限制? 详细来说,如果我有超过 16407 个字符,就会发生这种情况。我还有一个 GetXML 将检索 RUBBISH - 如果它是
EDIT2:
Roddy 是对的 - 我错过了 _bstr_t 是一个类...
铃响了吗?
干杯
【问题讨论】:
-
重读我的帖子。除非您 100% 了解它的工作原理,否则您需要完全放弃 BSTR。
-
您能否建议一段代码来实现您的解决方案,以便我通过示例来理解?