如何将IStream实例中的数据读入char指针?

时间:2011-08-19 13:50:45

标签: c++ windows winapi visual-c++ com

我正在尝试从我的IStream实例复制一些二进制数据(因为Gdiplus :: Image只保存到IStream派生对象或文件路径)到char指针,我只需通过知道已分配的二进制文件就可以读取它大小,并有权访问指针。

我的课程如下:

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;
}

在我处理上传实例的函数中,我这样做:

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

但是存储的内存是错误的(奇怪的是它看起来像是一种模式)。

我做错了什么?

提前致谢。

P.S .: 测试Image-instance在从m_hBufferStream读取后成功保存到文件中。

1 个答案:

答案 0 :(得分:1)

首先,IStream::Read()不需要精确读取指定的字节数 - 需要读取的数量不超过该数量。实际数字存储在第三个参数指向的可验证数字内。

其次,您不会检查HRESULT返回的Read()

更好的策略是在循环中调用Read(),检查其返回值,并根据实际读取的字节数调整指向缓冲区的指针。