0

GDI+ Bitmap クラスを使用して IStream を HBITMAP に変換しようとしています。IStream オブジェクトは、Web サービスからのデータを使用して設定されています。データを部分的に読み取り、後で Bitmap クラスで使用するオブジェクトに追加します。

ここにコードの関連部分があります

        char data1[] = "";
        int offset = 0;

        LPTSTR pszString = NULL;
        LPSTREAM lpStream = NULL;

        CreateStreamOnHGlobal(NULL, TRUE, &lpStream);
        StreamStringCopy ((LPSTREAM)lpStream, (LPCTSTR)"");
        while(of->pread(&data1,1023,offset) > 0){
            LPCTSTR tempStr = data1;
            StreamStringCat ((LPSTREAM)lpStream, tempStr);
            offset = offset + strlen(data1);    
        }
        Bitmap bm(lpStream,FALSE);
        bm.GetHBITMAP(Color.Black, &ret);

StreamStringCat は文字列を LPSTREAM オブジェクトに追加するので、単一の LPSTREAM オブジェクトを取得できます。

ループは初回のみ正常に実行されます。while ループに再び入ると、&data1 はアクセス違反の例外を発生させます。

この問題を解決する方法を教えてください。ありがとう。

4

1 に答える 1

1

まず、文字列リテラルに注意してください。のような文字列リテラル""は typeconst char*であるため、それらに書き込むことはできません。あなたの構造char data1[] = ""がそれを書き込み可能にするかどうかは完全にはわかりませんが、たとえそうであっても、そこに2文字分のメモリしかありませんdata1. これを試して:

char* data1 = static_cast<char*> (std::malloc (1024 * sizeof (char));

...

std::free (data1);

// or try this
char data1 [1024] = { 0 }; // Gives you 1024 bytes to write to on the stack

これにより、書き込み可能なメモリが割り当てられます。最初の実行後、メモリを上書きしたため、次の実行でアクセス違反が発生したと思います。

于 2009-02-07T09:29:48.787 に答える