All
это мой код
//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, я все равно получаю мусор.
В этот момент, если я попытаюсь присвоить искаженный указатель другому указателю, будет выдано сообщение об ошибке:
Попытка восстановления защищена от записи
объем памяти. это часто указание
эта другая память повреждена.
Есть предложения?
EDIT1:
Я обнаружил, что это происходит в связи с размером строки XML.
Если это произойдет с заданной строкой XML, и я уменьшу размер (сохраняя ту же схему), он будет работать нормально. Похоже, MSXML2 :: DOMDocument40 имеет ограничение по размеру?
Подробно это произойдет, если у меня будет более 16407 символов. У меня есть еще один GetXML, который получит RUBBISH - если он <= 16407, все работает нормально. </strong>
EDIT2:
Родди был прав - мне не хватало того, что _bstr_t
это класс ...
Звонит ли какой-нибудь колокол?
Приветствия