Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用内存缓冲区使用xmllite读取xml字符串_C++_Xmlreader_Xmllite - Fatal编程技术网

C++ 无法使用内存缓冲区使用xmllite读取xml字符串

C++ 无法使用内存缓冲区使用xmllite读取xml字符串,c++,xmlreader,xmllite,C++,Xmlreader,Xmllite,我正在尝试打开内存中的流,以便与xmllite库一起使用。给一个人写信还行,但给一个人读书让我很难受。下面是我正在使用的代码。基本上,我创建了一个默认xml字符串(LPWSTR),并使用CreateStreamOnHGlobal将其写入内存流。然后我找到开头,把它读回去,确保它在那里。然后我再次查找并将其分配给读取器的输入。它永远不会越过界线: while (S_OK == (hr = pReader->Read(&nodeType))) 我得到一个XmlNodeType_Non

我正在尝试打开内存中的流,以便与xmllite库一起使用。给一个人写信还行,但给一个人读书让我很难受。下面是我正在使用的代码。基本上,我创建了一个默认xml字符串(LPWSTR),并使用CreateStreamOnHGlobal将其写入内存流。然后我找到开头,把它读回去,确保它在那里。然后我再次查找并将其分配给读取器的输入。它永远不会越过界线:

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"