2012-04-23 91 views
0

我接收一些数据作为char数组。我想将这些数据传递给接收流的方法(IUnknown * pInput)。将数组写入IStream

我试图调试这段代码(使用Visual C++):


#include "xmllite.h" 
#include <atlbase.h> 

​​

我得到错误:

未处理的异常在0x75e49875在SSL。 exe:0xC0000005:访问冲突读取位置0x00000000。

我知道下面的代码从一个文件创建一个strem将工作,但我不想创建一个文件,因为我不能从原始数组转换。

CComPtr<IStream> pFileStream; 
LPCSTR szFileName = "FileName"; 
HRESULT hr; 

hr = SHCreateStreamOnFile(szFileName, STGM_READ, &pFileStream); 

回答

0

为了具体回答这个问题,代码段是:

CHAR *acTemp; 
acTemp = (CHAR *) GlobalAlloc (GMEM_FIXED, dwBytes); 
memcpy (acTemp, acXml, dwBytes); 
hr = ::CreateStreamOnHGlobal(acTemp, TRUE, &pDataStream); 

在这种情况下acXml是包含数据把流中的字符数组。

我没有找到为什么以前没有工作,但这一个迄今为止工作得很好。感谢@Matthias的帮助!

+0

您也可以先创建流,然后使用它的写入方法来填充数据,这是更直接的。 – 2012-04-26 06:35:49

+0

@SamuelZhang,你会怎么做?我有一些麻烦,我试过这个: '的IStream * pInput;'' CHAR caStream [] = “asdkhgkjfhgdhg”;'' pInput->写(caStream,的sizeof(caStream),NULL);' 而在得到了错误未处理的异常在0x002b1be2 SSL.exe:0xC0000005:访问冲突读取位置0x00000000。 – kdmin 2012-04-26 14:37:54

+0

首先,您需要创建IStream的一个实例,例如具有NULL处理程序的CreateStreamOnHGlobal。接下来,sizeof只返回字符指针的大小。请改用ARRAYSIZE。 – 2012-05-03 02:35:48

3

你可以做

CComPtr<IStream> stream; 
COM_VERIFY(::CreateStreamOnHGlobal(0, TRUE, &stream)); 

它也可以使用的GlobalAlloc指定 “自己的” 内存使用。 (如果您的德语好 - 请参阅http://msdn.microsoft.com/de-de/magazine/cc163436.aspx#S5)。

+0

对不起,但我该如何指定这个内存的内容?如何链接“acTemp”? (这个数组将会有一些数据输入) – kdmin 2012-04-23 21:08:09

+0

正如文章所说(用德语:-))要使用的内存是用CreateStreamOnHGlobal的第一个参数指定的。该示例给出0,但可以使用GlobalAlloc。也许它不可能连接到acTemp ...对不起:-( – Matthias 2012-04-24 08:19:23

+0

我相信德语的页面与[this]相同(http://msdn.microsoft.com/en-us/magazine/cc163436.aspx ) – kdmin 2012-04-24 11:35:58