如何将 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 指针?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串或char *转换为istream的最佳方法?

从 C++ 中的 istream 对象读取时如何检测空行?

如何将文件的内容读入C中的字符串?

如何将 istream 传递给 c++ 中的函数?

将 boost`s bufferstream 转换为 istream

C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数