2012-04-23 20 views
0

私は文字配列としていくつかのデータを受け取ります。このデータをストリーム(IUnknown * pInput)を受け取るメソッドに渡したいと思います。 SSLで0x75e49875で配列をIStreamに書き込む

未処理の例外:私はエラーを取得する


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

​​

は、私は、コードのこの部分(Visual C++を使用して)をデバッグしようとしました。 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をストリームに入れてデータを含むchar配列です。

私は前のことがうまくいかなかった理由を知りませんでしたが、これはこれまでのところうまく機能していました。助けてくれてありがとう@Matthias!

+0

また、ストリームを最初に作成してからwriteメソッドを使ってデータを書き込むこともできます(これはもっと簡単です)。 –

+0

@SamuelZhang、どうしたらいいですか?私はいくつかの問題を抱えています、私はこれを試しました: 'のIStream * pInput;' 'CHAR caStream [] = "asdkhgkjfhgdhg";' 'pInput->書き込み(caStream、はsizeof(caStream)、NULL);' とで0x002b1be2でエラー未処理の例外が発生しましたSSL.exe:0xC0000005:アクセス違反が0x00000000の場所を読み取る。 – kdmin

+0

まず、作成する必要がありますIStreamのインスタンス、例えば。 NULLハンドラを持つCreateStreamOnHGlobal。次に、sizeofはcharポインタのサイズを返します。代わりにARRAYSIZEを使用してください。 –

3

あなたは使用することを "自分" のメモリを指定するのGlobalAllocを使用することも可能

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

そのを行うことができます。 (あなたのドイツ語が良い場合に - http://msdn.microsoft.com/de-de/magazine/cc163436.aspx#S5を参照してください)。

+0

申し訳ありませんが、このメモリの内容はどのように指定しますか? "acTemp"にリンクするには? (この配列には何らかのデータ入力があります) – kdmin

+0

記事では(ドイツ語:-))、使用するメモリはCreateStreamOnHGlobalの最初のパラメータで指定されています。この例では0が返されますが、GlobalAllocを使用することは可能です。多分acTempに接続することができません...申し訳ありません:-( – Matthias

+0

私は、ドイツ語のページは[this](http://msdn.microsoft.com/en-us/magazine/cc163436.aspx ) – kdmin

関連する問題