Добрый день. Создаю с помощью CreateStreamOnHGlobal объект класса IStream (надеюсь, что правильно выразился), указав StreamBuffer в качестве буфера этого объекта. При этом StreamBuffer я сам выделял (не хочу давать CreateStreamOnHGlobal выделять мой буфер) размером в один мегабайт. После этого конвертирую с помощью GdipSaveImageToStream из своей bmp-картинки в jpg-картинку. При этом весь JPEG попадает в мой буфер StreamBuffer. Как мне определить, какой размер буфера надо выделять (ну ладно, заранее наверняка, что никак, но как узнать, какую часть буфера заполнил, а может переполнил GdipSaveImageToStream?) ?
FreeManCPM И да и нет... вроде. Я так понял, что Вы имеете в виду поле cbSize структуры STATSTG. Но проблема в том, что это поле после GdipSaveImageToStream содержит размер выделенного мной буфера (т.е. ровно один мегабайт), а не количество байт, записанных в этот буфер функцией GdipSaveImageToStream.
FreeManCPM Попробовал задать буфер, размером в десять байт, тогда cbSize возвращает нужный размер, но каким образом мой буфер тогда не переполняется? GdipSaveImageToStream каким-то образом довыделяет память? P.S. Хотя я ожидал, что GdipSaveImageToStream вернет StatusInsufficientBuffer.
я вобще ноль кидал в первый параметр CreateStreamOnHGlobal... можешь попробовать сделать IStream:Seek(0,STREAM_SEEK_CUR,&newsize) после заполнения и возможно получишь то что надо.
В MSDN про 1й параметр функции CreateStreamOnHGlobal сказано: hGlobal [in] The memory handle allocated by the GlobalAlloc function. The handle must be allocated as movable and nondiscardable. If the handle is shared between processes, it must also be allocated as shared. New handles should be allocated with a size of zero. If hGlobal is NULL, the CreateStreamOnHGlobal function internally allocates a new shared memory block of size zero. Так что можно смело задавать 0 в GlobalAlloc или вообще оставить выделение памяти на совести CreateStreamOnHGlobal. Сейчас попробовал оба варианта - через Stat и через Seek. Оба возвращают корректный размер записанного jpeg'а.
FreeManCPM Может воспользуюсь, но думаю, что буду выделять вначале буфер, размером в 1 байт, а потом пусть мне GdipSaveImageToStream расширяет мой буфер. Т.е. проблема решена. Теперь мне просто интересно, почему GdipSaveImageToStream не возвращает StatusInsufficientBuffer, а довыделяет память. Хотя ну его: наверное StatusInsufficientBuffer для чего-то другого рассчитан. Большой сэнкс. roman_pro Спасибо. Я знаю, что в MSDN сказано. Именно поэтому я во избежание подобных ответов в первом посте написал