C++ 无法使用内存缓冲区使用xmllite读取xml字符串
我正在尝试打开内存中的流,以便与xmllite库一起使用。给一个人写信还行,但给一个人读书让我很难受。下面是我正在使用的代码。基本上,我创建了一个默认xml字符串(LPWSTR),并使用CreateStreamOnHGlobal将其写入内存流。然后我找到开头,把它读回去,确保它在那里。然后我再次查找并将其分配给读取器的输入。它永远不会越过界线:C++ 无法使用内存缓冲区使用xmllite读取xml字符串,c++,xmlreader,xmllite,C++,Xmlreader,Xmllite,我正在尝试打开内存中的流,以便与xmllite库一起使用。给一个人写信还行,但给一个人读书让我很难受。下面是我正在使用的代码。基本上,我创建了一个默认xml字符串(LPWSTR),并使用CreateStreamOnHGlobal将其写入内存流。然后我找到开头,把它读回去,确保它在那里。然后我再次查找并将其分配给读取器的输入。它永远不会越过界线: while (S_OK == (hr = pReader->Read(&nodeType))) 我得到一个XmlNodeType_Non
while (S_OK == (hr = pReader->Read(&nodeType)))
我得到一个XmlNodeType_None和一个HRESULT值-1072894427。我相信它读这条小溪有困难,但我不确定。如果改用文件流,并且从内存流写入xml,同样的代码也可以正常工作
HRESULT hr = S_OK; CComPtr<IStream> pStream = NULL;
IXmlReader *pReader = NULL;
XmlNodeType nodeType;
LPWSTR pwszXMLString =
L"<?xml version\"1.0\" encoding=\"UTF-8\" ?>\r\n"
L"<paramlist name=\"LP\">\r\n"
L"<value></value>\r\n"
L"<value></value>\r\n"
L"</paramlist>\r\n"
L"<param name=\"AutoConnect\">false</param>\r\n"
L"<param name=\"ConnectWhenLit\">false</param>\r\n"
L"<param name=\"SessionMaxBytes\">200000</param>\r\n"
L"<param name=\"SessionTimeoutSecs\">300</param>\r\n"
L"<param name=\"PacketDelayMs\">0</param>\r\n"
L"<param name=\"PacketSizeBytes\">4096</param>\r\n"
L"<param name=\"LowSSLSecurity\">true</param>\r\n";
DWORD dwWritten = 0;
hr = CreateStreamOnHGlobal(NULL, FALSE, &pStream);
hr = pStream->Write(pwszXMLString, wcslen(pwszXMLString) * sizeof(WCHAR), &dwWritten);
// print out the contents of the memory stream just to make sure we have it
LARGE_INTEGER pos;
pos.QuadPart = 0;
pStream->Seek(pos, STREAM_SEEK_SET, NULL);
STATSTG ssStreamData = {0};
pStream->Stat(&ssStreamData, STATFLAG_NONAME);
SIZE_T cbSize = ssStreamData.cbSize.LowPart;
LPWSTR pwszContent = (WCHAR*) new BYTE[cbSize + sizeof(WCHAR)];
if (pwszContent == NULL)
return E_OUTOFMEMORY;
pStream->Seek(pos, STREAM_SEEK_SET, NULL);
SIZE_T cbRead;
pStream->Read(pwszContent, cbSize, &cbRead);
pwszContent[cbSize/sizeof(WCHAR)] = L'\0';
CZString czContent;
czContent.LoadWideString(pwszContent, cbSize);
wprintf(L"%S", czContent.GetString().c_str());
pStream->Seek(pos, STREAM_SEEK_SET, NULL);
if (hr == S_OK)
{
typedef HRESULT (WINAPI *CreateXmlReaderFunc)(const IID & riid, void** ppvObject, IMalloc * pMalloc);
CreateXmlReaderFunc _CreateXmlReaderFunc = (CreateXmlReaderFunc)GetProcAddress(m_hXMLLite, "CreateXmlReader");
if (FAILED(hr = _CreateXmlReaderFunc(__uuidof(IXmlReader), (void**) &pReader, NULL)))
{
MessageBox(NULL, CStringHelper::Format(L"Error: GetProcAddress() failed to find 'CreateXmlReader' %d\n", GetLastError()).c_str(), L"Error", MB_OK);
return -1;
}
pReader->SetInput(pStream);
}
while (S_OK == (hr = pReader->Read(&nodeType)))
{
switch (nodeType)
{
// parse xml here
}
}
return 0;
HRESULT hr=S_正常;CComPtr pStream=NULL;
IXmlReader*pReader=NULL;
XmlNodeType节点类型;
LPWSTR pwszXMLString=
L“\r\n”
L“\r\n”
L“\r\n”
L“\r\n”
L“\r\n”
L“错误\r\n”
L“错误\r\n”
L“200000\r\n”
L“300\r\n”
L“0\r\n”
L“4096\r\n”
L“true\r\n”;
DWORD DWWRITED=0;
hr=CreateStreamOnHGlobal(NULL、FALSE和pStream);
hr=pStream->Write(pwszXMLString、wcslen(pwszXMLString)*sizeof(WCHAR)和dwwrite);
//打印出内存流的内容以确保我们拥有它
大整数位;
四分位=0;
pStream->Seek(位置、流搜索设置、空);
STATSTG ssStreamData={0};
pStream->Stat(&ssStreamData,STATFLAG_NONAME);
SIZE\u T cbSize=ssStreamData.cbSize.LowPart;
LPWSTR pwszContent=(WCHAR*)新字节[cbSize+sizeof(WCHAR)];
if(pwszContent==NULL)
返回E_OUTOFMEMORY;
pStream->Seek(位置、流搜索设置、空);
尺寸T cbRead;
pStream->Read(pwszContent、cbSize和cbRead);
pwszContent[cbSize/sizeof(WCHAR)]=L'\0';
CZString-czContent;
LoadWideString(pwszContent,cbSize);
wprintf(L“%S”,czContent.GetString().c_str());
pStream->Seek(位置、流搜索设置、空);
如果(hr==S_正常)
{
typedef HRESULT(WINAPI*CreateXmlReaderFunc)(常量IID和riid,void**ppvObject,IMalloc*pMalloc);
CreateXmlReaderFunc_CreateXmlReaderFunc=(CreateXmlReaderFunc)GetProcAddress(m_hXMLLite,“CreateXmlReader”);
if(失败(hr=_CreateXmlReaderFunc(__uuidof(IXmlReader),(void**)和pReader,NULL)))
{
MessageBox(NULL,CStringHelper::Format(L“错误:GetProcAddress()未能找到'CreateXmlReader'%d\n',GetLastError())。c_str(),L“错误”,MB_OK);
返回-1;
}
预编码器->设置输入(pStream);
}
而(S_OK==(hr=pReader->Read(&nodeType)))
{
开关(节点类型)
{
//在这里解析xml
}
}
返回0;
您的xml字符串不正确。“版本”和“1.0”之间必须有“=”。其次,字符串使用UTF-16,而头文件声明它是UTF-8。将标头中的UTF-8更改为UTF-16或删除编码属性。
或者
LPWSTR pwszXMLString=
L“\r\n”
或
LPWSTR pwszXMLString=
L“\r\n”
有效。谢谢,是的,这就是问题所在
LPWSTR pwszXMLString =
L"<?xml version=\"1.0\" encoding=\"UTF-16\" ?>\r\n"
LPWSTR pwszXMLString =
L"<?xml version=\"1.0\"?>\r\n"