3

ソケット接続を介して画像を送信しようとしていますが、次のコードに問題があります。

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

//saving the image to a file
myImage = Image::FromStream(myStreamR);
myImage->Save(lpszFilename, &imageCLSID, NULL);

プログラムはコンパイルされて実行されますが、イメージが取得されません。元の「myStream」を使用した場合は取得できますが、元のストリームから読み取ったchar配列から構築された「myStreamR」を使用した場合は取得できません。

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

4

1 に答える 1

6

MyStreamRデータを書き込んだ後、最初に戻ることを求めているのではありません。Image::FromStream()ストリームの現在の位置から読み取りを開始するため、シークバックしないと、読み取るデータがありません。

これを試して:

STATSTG myStreamStats = {0};
if (FAILED(myStream->Stat(&myStreamStats, 0)))
    cout << "Stat failed!" << endl;
else
{
    char* streamData = new char[myStreamStats.cbSize.QuadPart];

    ULONG bytesSaved = 0;
    if (FAILED(myStream->Read(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved)))
        cout << "Read failed!" << endl;
    else
    {
        //char array to stream
        if (FAILED(myStreamR->Write(streamData, bytesSaved, &bytesSaved)))
            cout << "Write failed!" << endl;
        else
        {
            LARGE_INTEGER li;
            li.QuadPart = 0;

            if (FAILED(myStreamR->Seek(li, STREAM_SEEK_SET, NULL)))
                cout << "Seek failed!" << endl;
            else
            {
                //saving the image to a file
                myImage = Image::FromStream(myStreamR);
                if (myImage1->GetLastStatus() != Ok)
                    cout << "FromStream failed!" << endl;
                else
                {
                    if (myImage->Save(lpszFilename, &imageCLSID, NULL) != Ok)
                        cout << "Save failed!" << endl;
                    else
                        cout << "OK!" << endl;
                }
            }
        }
    }
}
于 2012-12-05T03:55:18.690 に答える