2012-04-23 42 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