首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

IPicture中的装载图片OleLoadPicture失败解决办法

2013-09-06 
IPicture中的装载图片OleLoadPicture失败我从内存中读取一个已存好的图片,然后在OnPaint中调用下面的IPict

IPicture中的装载图片OleLoadPicture失败
我从内存中读取一个已存好的图片,然后在OnPaint中调用下面的IPicture方法,返回出错,代码如下

                                                                            
[解决办法]
/*
  *如下代码段实现的功能是从指定的路径中读取图片,并显示出来
  */
  void DisplayImage(HDC hDC, LPCTSTR szImagePath)
  {
  HANDLE hFile=CreateFile(szImagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //从指定的路径szImagePath中读取文件句柄
  DWORD dwFileSize=GetFileSize(hFile, NULL); //获得图片文件的大小,用来分配全局内存
  HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //给图片分配全局内存
  void *pImageMemory=GlobalLock(hImageMemory); //锁定内存
  DWORD dwReadedSize; //保存实际读取的文件大小
  ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //读取图片到全局内存当中
  GlobalUnlock(hImageMemory); //解锁内存
  CloseHandle(hFile); //关闭文件句柄
  IStream *pIStream;//创建一个IStream接口指针,用来保存图片流
  IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象
  CreateStreamOnHGlobal(hImageMemory, false, &pIStream) //用全局内存初使化IStream接口指针
  OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针


  //得到IPicture COM接口对象后,你就可以进行获得图片信息、显示图片等操作
  OLE_XSIZE_HIMETRIC hmWidth;
  OLE_YSIZE_HIMETRIC hmHeight;
  pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高
  pIPicture->get_Height(&hmHeight);
  pIPicture->Render(hDC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL); //在指定的DC上绘出图片
  GlobalFree(hImageMemory); //释放全局内存
  pIStream->Release(); //释放pIStream
  pIPicture->Release(); //释放pIPicture
  }


[解决办法]
CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);
改为
CreateStreamOnHGlobal(pData,FALSE,&m_pStream);
[解决办法]
第一步:检查参考CreateStreamOnHGlobal用法,检查下该函数的返回值
 并根据返回值检查下问题所在

[解决办法]
一共能影响的代码就那么几句
同意楼上的先看看CreateStreamOnHGlobal
WINOLEAPI CreateStreamOnHGlobal(   
HGLOBAL hGlobal, //Memory handle for the stream object   
BOOL fDeleteOnRelease, //Whether to free memory when the object is released   LPSTREAM *ppstm //Address of output variable that receives the IStream interface pointer ); 
如果函数创建流对象成功则返回S_OK。

[解决办法]
检查下函数的OleLoadPicture返回值

This function OleLoadPicture returns S_OK on success. Other possible values include the following.

Return code Description 
E_NOINTERFACE  The object does not support the specified interface.
E_POINTER  The stream is not valid. For example, it may be NULL. 
 

[解决办法]
http://social.msdn.microsoft.com/search/zh-CN?query=OleLoadPicture
这里面的你看看,说不定能帮你解决
[解决办法]
有可能抓取图片到内存中出现了问题
先测试下把抓取的图片保存成bmp文件,这个bmp文件能打开吗?

[解决办法]
http://blog.csdn.net/robertbaker/article/details/4136888

热点排行