我正在尝试从我的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读取后成功保存到文件中。
答案 0 :(得分:1)
首先,IStream::Read()
不需要精确读取指定的字节数 - 需要读取的数量不超过该数量。实际数字存储在第三个参数指向的可验证数字内。
其次,您不会检查HRESULT
返回的Read()
。
更好的策略是在循环中调用Read()
,检查其返回值,并根据实际读取的字节数调整指向缓冲区的指针。