gpt4 book ai didi

c++ - MSXML2::IXMLDOMDocument2Ptr->GetXML() 弄乱了我的字符串!

转载 作者:行者123 更新时间:2023-11-30 00:42:33 25 4
gpt4 key购买 nike

全部,

这是我的代码

//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 文档中的任何内容,我仍然得到垃圾。

此时如果我尝试将损坏的指针分配给另一个指针,它将抛出一个错误:

Attempted to restore write protected memory. this is often an indication that other memory is corrupted.

有什么建议吗?

编辑1:

我发现这与 XML 字符串的大小有关。如果它发生在给定的 XML 字符串上,并且我减小了大小(保持相同的架构),它将正常工作。看起来像 MSXML2::DOMDocument40 有大小限制?详细来说,如果我有超过 16407 个字符,它就会发生。我还有一个 GetXML 将检索 RUBBISH - 如果它 <= 16407 一切正常。

编辑2:

Roddy 是对的 - 我错过了 _bstr_t 是一个类 ...

响铃了吗?

干杯

最佳答案

尝试替换

 BSTR Markup;

 bstr_t Markup;

BSTR 几乎是一个愚蠢的指针,我认为 GetXML() 的返回结果被转换为一个临时的,然后在您看到它时被销毁。 bstr_t 用一些智能指针包装它......

注意:您的“SuperMarkup”并没有按照我的建议进行。同样,BSTR 只是一个指针,并不“拥有”它指向的内容。另一方面,bstr_t 确实如此。我认为您的 GetXML() 函数正在返回一个 bstr_t,然后在超出范围时将其删除,使您的 BSTR 指向不再有效的内存。

关于c++ - MSXML2::IXMLDOMDocument2Ptr->GetXML() 弄乱了我的字符串!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com