如何将 IStream 实例中的数据读入 char 指针?
Posted
技术标签:
【中文标题】如何将 IStream 实例中的数据读入 char 指针?【英文标题】:How do I read the data from an IStream instance into a char pointer? 【发布时间】:2011-10-30 15:45:20 【问题描述】:我正在尝试将一些二进制数据从我的 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());
但是存储的内存是错误的(奇怪的是它看起来像是一种模式)。
我做错了什么?
提前致谢。
附: 测试Image-instance从m_hBufferStream读取后成功保存到文件中。
【问题讨论】:
【参考方案1】:首先,IStream::Read()
不需要准确读取指定数量的字节 - 需要读取的字节数不超过该数量。实际数字存储在第三个参数指向的veriable中。
其次,你不要检查Read()
返回的HRESULT
。
更好的策略是在循环中调用Read()
,检查其返回值并根据实际读取的字节数调整指向缓冲区的指针。
【讨论】:
【参考方案2】:我遇到了同样的问题 - 问题是
位图->保存 写入字节并将偏移量移动到流的末尾,当您尝试获取字节时,它开始从流的末尾读取,因此将读取 0 个字节。所以你需要从流的开始点读取偏移量:
LARGE_INTEGER li = 0;
m_hBufferStream->Seek(li, STREAM_SEEK_SET, NULL);
【讨论】:
以上是关于如何将 IStream 实例中的数据读入 char 指针?的主要内容,如果未能解决你的问题,请参考以下文章