0

IStream インターフェイスで GdipSaveImageToStream() を使用して格納された画像をソケット接続経由で送信するにはどうすればよいですか?

send() 関数には char 配列が必要ですが、データを IStream から char 配列に抽出する方法がわかりません。

memcpy() を使用するのは良い考えでしょうか? データを char 配列に格納し、反対側でストリームを再構築しますか?

[編集]

read を使用してみましたが、何か不足しています。

//stream to char array, to send
STATSTG myStreamStats;
ULONG bytesSaved;
myStream->Stat(&myStreamStats, 0);
char* streamData = new char[myStreamStats.cbSize.QuadPart];
if(myStream->Read(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
    cout<<"OK!"<<endl;
else
    cout<<"Not OK!"<<endl;

//char array to stream, to save
if(myStreamR->Write(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
    cout<<"OK!"<<endl;
else
    cout<<"Not OK!"<<endl;

myImage = Image::FromStream(myStreamR);
myImage->Save(lpszFilename, &imageCLSID, NULL);

[注 1:] プログラムはコンパイルおよび実行されますが、イメージが得られません。元の「myStream」を使用すると取得できますが、元のストリームから読み取った char 配列から構築された「myStreamR」では取得できません。

[注 2:] 出力は 2 つの「OK!」です。これは、すべてのバイトが配列にコピーされ、それらすべてが新しいストリームに貼り付けられることを意味します。ただし、savedBytes を確認したところ、read() の後は 0 (良くない) であるのに対し、write() の後は指定したストリーム サイズと等しいことがわかりました。では、何も読み取られていない場合、地球上で read() が「S_OK」フラグを表示するのはなぜですか?

【注3】何かが足りない。

4

1 に答える 1

0

Joachim PileborgとZaneが指摘しているように、読み取りと書き込みを使用することは確かに正しいアプローチです。

ただし、ストリームが使用されるたびにシークカーソルの位置が変わることに注意してください。したがって、読み取りの前と書き込みの前に、Seekメソッドを使用してカーソルをストリームの先頭に戻します。

例:

LARGE_INTEGER li;
li.QuadPart = 0;
myStream->Seek(li, STREAM_SEEK_SET, NULL);
于 2012-12-05T23:12:08.590 に答える