请教达人,如何将内存中一个BYTE*指针转为IStream*?

shihui2009 2010-09-03 02:40:11
想用CImage类

HRESULT Load(
IStream* pStream
) throw();

函数,将内存中的数据直接存为JPG格式图像。


HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, 1);

byte* pData = (byte*)GlobalLock(hGlobal);
memcpy(pData, pMemData, 1);


IStream * pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, FALSE, & pStream) == S_OK)
{
CImage image = new CImage;
if (SUCCEEDED(image.Load(pStream)))
{

// ..


}
pStream -> Release();
}
GlobalFree(hGlobal);

image load失败,为啥呢?
...全文
660 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
wencan2010 2011-05-20
  • 打赏
  • 举报
回复
路过
同求答案
ltwin211 2010-09-08
  • 打赏
  • 举报
回复
路过,学习学习
iamshuke 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 akirya 的回复:]
仔细看remark ..
里面说了早期版本要使用序号,新系统可以直接使用名字.
[/Quote]

嗯, 是没看仔细, vista之前的版本可以用序号12。
iamshuke 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shihui2009 的回复:]
内存里面的数据要加什么东东才能成为图像格式的数据吗?
[/Quote]

如果你的内存中只是像素数据肯定是不行的,你可以搜一下CSDN,把这些像素转成bmp文件格式的数据,应该就行了(不过要转成bmp文件格式,还不如转成HBITMAP,直接在GDI中显示呢)。
shihui2009 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 visualeleven 的回复:]
引用 15 楼 shihui2009 的回复:
System.exe 中的 0x77c172e3 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突

空指针异常。。。
[/Quote]

现在已经不是那个问题了。。
是图像载入失败。。
Eleven 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 shihui2009 的回复:]
System.exe 中的 0x77c172e3 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
[/Quote]
空指针异常。。。
shihui2009 2010-09-07
  • 打赏
  • 举报
回复
内存里面的数据要加什么东东才能成为图像格式的数据吗?
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 iamshuke 的回复:]

引用 12 楼 akirya 的回复:
C/C++ code
IStream *SHCreateMemStream(const BYTE *pInit, UINT cbInit );

注意看MSDN中 Remarks 部分。


这个函数不一定能用的了,MSDN中说是“Shlwapi.dll (version 5.0 or later)”中定义,但我的XP中该dll版本是6.0.……
[/Quote]
仔细看remark ..
里面说了早期版本要使用序号,新系统可以直接使用名字.
iamshuke 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]
C/C++ code
IStream *SHCreateMemStream(const BYTE *pInit, UINT cbInit );

注意看MSDN中 Remarks 部分。
[/Quote]

这个函数不一定能用的了,MSDN中说是“Shlwapi.dll (version 5.0 or later)”中定义,但我的XP中该dll版本是6.0.2900.3562,竟然没有导出该函数。
shihui2009 2010-09-06
  • 打赏
  • 举报
回复
我是拿我自己程序采集的数据实验的。。。
而且保证里面的数据肯定是像素值的。。
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 kay_1010 的回复:]

好像好难。没有人真正解决掉吗。我也学习学习
[/Quote]
看 #12
iamshuke 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shihui2009 的回复:]
这部分代码没有问题,不过在使用CIMAGE::load的时候返回还是E_FAIL
[/Quote]

那当然了,你直接load我创建的stream,里面都是一些乱七八糟的数据,肯定失败。还是要根据你的数据创建。即然后面的那段代码没问题,说明是你的pMemData数据有问题,比如说width或Num不对,调试一下吧。
shihui2009 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 iamshuke 的回复:]
看来你的内存还是没申请对,访问0内存了。试了一下,下面的代码执行没问题,你再检查一下吧。


C/C++ code

int width = 10;
int Num = 1;
int nSize = width*512*Num; //BYTE*指向的数据的长度
BYTE* pMemData = new BYTE[nSize];

……
这部分代码没有问题,不过在使用CIMAGE::load的时候返回还是E_FAIL
路过_斌斌 2010-09-06
  • 打赏
  • 举报
回复
好像好难。没有人真正解决掉吗。我也学习学习
iamshuke 2010-09-06
  • 打赏
  • 举报
回复
看来你的内存还是没申请对,访问0内存了。试了一下,下面的代码执行没问题,你再检查一下吧。


int width = 10;
int Num = 1;
int nSize = width*512*Num; //BYTE*指向的数据的长度
BYTE* pMemData = new BYTE[nSize];

HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_NODISCARD,nSize);
IStream *pStream = NULL;
CreateStreamOnHGlobal(hMem,TRUE,&pStream);
pStream->Write(pMemData, nSize, NULL);

ULARGE_INTEGER pos;
LARGE_INTEGER iMove;
iMove.QuadPart = 0;
pStream->Seek(iMove,STREAM_SEEK_SET,&pos);

shihui2009 2010-09-06
  • 打赏
  • 举报
回复
System.exe 中的 0x77c172e3 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
shihui2009 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 iamshuke 的回复:]
//()换成[],否则只是相当于new了一个字节,并把它的值初始化成width*512*Num了。后面使用时内存越界了。
pMemData = new byte[width*512*Num];
int nSize = width*512*Num;
[/Quote]

还是会出现提示。。
写入内存错误。。
iamshuke 2010-09-06
  • 打赏
  • 举报
回复
//()换成[],否则只是相当于new了一个字节,并把它的值初始化成width*512*Num了。后面使用时内存越界了。
pMemData = new byte[width*512*Num];
int nSize = width*512*Num;
  • 打赏
  • 举报
回复
IStream *SHCreateMemStream(const BYTE *pInit, UINT cbInit );

注意看MSDN中 Remarks 部分。
shihui2009 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iamshuke 的回复:]
int nSize = ...; //BYTE*指向的数据的长度
HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_NODISCARD,nSize);
IStream *pStream = NULL;
CreateStreamOnHGlobal(hMem,TRUE,&pStream);
pStream->Write(pMemData,nSize,NULL);
我运行到最后一步的时候就出错了。。

pMemData = new byte(width*512*Num);

我是这么定义这个指针的

int nSize = width*512*Num;
这样不对吗?







加载更多回复(10)

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧