dポイントプレゼントキャンペーン実施中!

開発環境はVC++/CLIです。
アンマネージ型のCOMオブジェクトの扱いで困っております。

JPEGやPNGなどの画像データを保存したunsigned char型配列から、Gdiplus::Bitmap型を作ろうとしています。

unsigned int imagesize; // 画像のバイト数が格納されている
array<unsigned char>^ image = gcnew array<unsigned char>(imagesize); //画像のデータが格納されている

事前にこのようなデータを用意し、以下のように記述しました。

HGLOBAL hResourceBuffer = GlobalAlloc(GMEM_MOVEABLE , imagesize);
void* pResourceBuffer = GlobalLock(hResourceBuffer);
CopyMemory(pResourceBuffer, &image, imagesize);
IStream* pIStream = NULL;
CreateStreamOnHGlobal(hResourceBuffer, TRUE, &pIStream)
data->bmp = new Gdiplus::Bitmap(pIStream);
pIStream->Release();
GlobalUnlock(hResourceBuffer);
GlobalFree(hResourceBuffer);

しかしながら、上記のコードだと、CopyMemory時に「保護されたメモリに書き込もうとした」といったエラーが発生します。
Webで色々検索しましたが、全て似たような記述で動作していました。
何が問題なのでしょうか?

尚、上記と同様の画像データ配列を使って、System::Drawing::Bitmap型に格納したとき、画像が正常に表示されることを確認しております。
画像のバイト数に於いても取得したデータに間違いはなく、やはりメモリ関連の問題だと思うのですが…。
MemoryStream^ memst = gcnew MemoryStream(image);
Bitmap^ bmp = gcnew Bitmap(memst);
memst->Close();
Graphics^ im = pictureBox1->CreateGraphics();
im->DrawImage(bmp, 0, 0, 100, 100);
delete bmp;

A 回答 (1件)

マネージドのポインタをそのままアンマネージ関数に渡しているのが原因ではないでしょうか



pin_ptr<unsigned char>p = &image[0];
unsigned char *pbuf = p;
CopyMemory( pResourceBuffer, p, imagesize );

といった具合で出来ると思います
    • good
    • 0
この回答へのお礼

マネージ型のポインタと、アンマネージ型のポインタの互換性は無いのですか…。
悩んでいたところを助けていただき、どうも有難う御座いました。

お礼日時:2009/04/22 00:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!