Как мне прочитать данные из экземпляра IStream в указатель на символ? - PullRequest
2 голосов
/ 19 августа 2011

Я пытаюсь скопировать некоторые двоичные данные из моего экземпляра IStream (поскольку Gdiplus :: Image сохраняет только в производные от IStream объекты или путь к файлу) в указатель на символ, из которого я могу просто прочитать, зная выделенный двоичный файл Размер и доступ к указателю.

Мой класс выглядит следующим образом:

Upload::Upload(Gdiplus::Bitmap* bitmap, CLSID clsEncoderId)
{
    int result;
    STATSTG statResult;

    result = CreateStreamOnHGlobal(0, TRUE, &m_hBufferStream);

    if (result != S_OK)
        MessageBoxW(NULL, _T("Upload::Upload(): Could not create stream"), _T("Point"), MB_OK | MB_ICONERROR);
    else
    {
        if (bitmap->Save(m_hBufferStream, &clsEncoderId, NULL) != Gdiplus::Ok)
            MessageBoxW(NULL, _T("Upload::Upload(): Could not save() image"), _T("Point"), MB_OK | MB_ICONERROR);
    }

    if (m_hBufferStream->Stat(&statResult, STATFLAG_NONAME) != S_OK)
        return;

    Gdiplus::Image test(m_hBufferStream, TRUE);
    test.Save(_T("hejs.png"), &clsEncoderId, NULL);

    m_iSize = statResult.cbSize.LowPart;
}

char* Upload::GetBinaryData()
{
    char* buffer = (char*)malloc(m_iSize);
    ULONG size = 0;

    m_hBufferStream->Read(buffer, m_iSize, &size);

    return buffer;
}

В моей функции, которая обрабатывает экземпляр Upload, я делаю это:

char* pBuffer = upload->GetBinaryData();
buffer.write(pBuffer, upload->GetSize());

Но сохраненная память неправильна (хотя странно, что это похоже на шаблон).

Что я делаю не так?

Заранее спасибо.

P.S .: Тестовый экземпляр Image успешно сохраняется в файл после чтения из m_hBufferStream.

1 Ответ

1 голос
/ 19 августа 2011

Прежде всего, IStream::Read() не требуется для считывания точно указанного количества байтов - требуется считывать не более этого числа. Фактическое число сохраняется внутри проверяемого, указанного третьим параметром.

Во-вторых, вы не проверяете HRESULT, возвращаемое Read().

Гораздо лучшей стратегией было бы вызвать Read() в цикле, проверить его возвращаемое значение и настроить указатель на буфер в соответствии с тем, сколько байтов было фактически прочитано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...