想用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失败,为啥呢?

解决方案 »

  1.   

    有没有用getlasterr看看错误信息!
      

  2.   

    使用CMemFile
    或者更酷的CxFile之类的
      

  3.   

    hr = CreateStreamOnHGlobal(NULL, TRUE, &pStm);
    if (FAILED(hr)) _com_issue_error(hr);

    DWORD cbWritten;
    pStm->Write(pSourceBuf, nSourceStreamLen, &cbWritten);

    LARGE_INTEGER l;
    l.QuadPart = 0;
    pStm->Seek(l,STREAM_SEEK_SET,NULL);
      

  4.   

    加上最后一段看。
    pSourceBuf, nSourceStreamLen是源和长度
      

  5.   

    还是不行呢。。
    继续求教。。
    将一个BYTE*转为一个IStream*就行了。。
    谢谢。。
      

  6.   

    只能先创建一个istream。然后把byte* 先入 istream.
      

  7.   

    然后把byte* 写入 istream.
      

  8.   

    你的代码中只给流申请了1字节的内存,肯定不行的。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);ULARGE_INTEGER pos;
    LARGE_INTEGER iMove;
    iMove.QuadPart = 0;
    pStream->Seek(iMove,STREAM_SEEK_SET,&pos);
      

  9.   

    [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.   

    IStream *SHCreateMemStream(const BYTE *pInit, UINT cbInit );
    注意看MSDN中 Res 部分。
      

  11.   

    //()换成[],否则只是相当于new了一个字节,并把它的值初始化成width*512*Num了。后面使用时内存越界了。
    pMemData = new byte[width*512*Num];
    int nSize = width*512*Num;
      

  12.   

    System.exe 中的 0x77c172e3 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
      

  13.   

    看来你的内存还是没申请对,访问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);
      

  14.   

    [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
      

  15.   


    那当然了,你直接load我创建的stream,里面都是一些乱七八糟的数据,肯定失败。还是要根据你的数据创建。即然后面的那段代码没问题,说明是你的pMemData数据有问题,比如说width或Num不对,调试一下吧。
      

  16.   


    这个函数不一定能用的了,MSDN中说是“Shlwapi.dll (version 5.0 or later)”中定义,但我的XP中该dll版本是6.0.2900.3562,竟然没有导出该函数。
      

  17.   


    嗯, 是没看仔细, vista之前的版本可以用序号12。
      

  18.   


    如果你的内存中只是像素数据肯定是不行的,你可以搜一下CSDN,把这些像素转成bmp文件格式的数据,应该就行了(不过要转成bmp文件格式,还不如转成HBITMAP,直接在GDI中显示呢)。