Здравствуйте все!
Имеется некая функция:
void * MakeImg()
{
...
GdiplusStartup(&token, gdiplusStartupInput, NULL);
...
IStream * pStream = NULL;
if (!SUCCEEDED(CreateStreamOnHGlobal(NULL, -1, &pStream))) return NULL;
if (!SUCCEEDED(pImage->Save(pStream, &imgClsid, &encoderParams))) return NULL;
GdiplusShutdown(token);
return pStream;
}
Так, pStream получили, теперь вопрос: как с помощью методов read и write, класса IStream, сделать копию этого потока, чтобы потом сохранить его в файл, используюя GdiPlus?
Я это делаю примерно так (код немного упростил):
{
// Получаю поток
IStream * pStream = NULL;
pStream = (IStream *) MakeImg();
// Получаю размер потока
ULARGE_INTEGER StreamPos;
LARGE_INTEGER dmove;
dmove.QuadPart = 0;
pStream->Seek(zero, STREAM_SEEK_END, &StreamPos);
DWORD dwSize = (DWORD) StreamPos.QuadPart;
// Создаю поток, в который хочу скопировать содержимое первого потока
IStream * pStream2 = NULL;
CreateStreamOnHGlobal(NULL, -1, &pStream2);
pStream2->Write(pStream, dwSize, NULL);
// Далее — в файл
...
Image * image = new image(pStream2, false); // image из потока не создается и файл, соответственно, тоже...
image->Save(L"C:\\image.jpg", &imgClsid, &encoderParams)
...
}
Пробовал конструкцию Write заменить на pStream->Read(pStream2, dwSize, NULL); — Access violation...
Причем, если посмотреть число скопированных байтов, когда я использую Write, то оно будет равно размеру 1-го потока, т.е. , как я понял, данные из потока копируются полностью, но токда где грабли? Ну, а с Read вообще непонятки...
Что делать? Куда бежать?