昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出:

Call OleLoadPicture Fail - loadPictureFromMW

奇怪,这个图片批量处理软件我一直在用,在 xp系统下从来没出现过这样的提示,为什么在 win7下无法正常进行图片的效果预览?

更让我接受不了的是,从来没有用户或朋友向我反应这个问题,难道他们都不用 win7?

今天下午问了一个朋友借了台win7的笔记本,通过一下午的测试,解决了这个问题。

之前的代码思路:

通过 PBYTE pData =MagickGetImageBlob(MagickWand *, size_t length) 获取一张图片在内存中的指针和长度。

if(CreateStreamOnHGlobal(pData, FALSE, &pstream) == S_OK) //将字节数组转换成 IStream*{       if(SUCCEEDED(OleLoadPicture(pstream, length, TRUE, &IID_IPicture, (void**)&pPic)))

这个代码在 xp下运行一切正常,可以正常加载 pData 指向的图片数据。

但在 win7奇旗舰版下, OleLoadPicture(....) 返回值 < 0

搞了2个小时也没找到解决办法,这个时候我想起 OleLoadPicture 加载文件的时候先根据文件大小分配一个内存空间,然后加载文件到指定的内存空间:

HANDLE FileHandle;ULONG SizeH, SizeL, ReadCount;IStream *pstream = NULL;//IPicture *pPic = NULL;FileHandle = CreateFile(pFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);if(FileHandle == INVALID_HANDLE_VALUE)return;SizeL = GetFileSize(FileHandle, &SizeH);HGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, SizeL);if(pBuffer == NULL){CloseHandle(FileHandle);return;}LPVOID pDes = GlobalLock(pBuffer);if(ReadFile(FileHandle, pDes, SizeL, &ReadCount, NULL) == 0){GlobalUnlock(pBuffer);CloseHandle(FileHandle);GlobalFree(pBuffer); //释放全局内存return;}GlobalUnlock(pBuffer);CloseHandle(FileHandle);if(CreateStreamOnHGlobal(pBuffer, TRUE, &pstream) != S_OK){GlobalFree(pBuffer); //释放全局内存return;}if(SUCCEEDED(OleLoadPicture(pstream, SizeL, TRUE, &IID_IPicture, (void**)&pPic))){

由于 pData是通过MagickGetImageBlob()获取的图片数据指针, 会不会是 OleLoadPicture 无法加载指向 pData的图片数据呢?

我就按照 OleLoadPicture 加载图片文件的方式,先根据图片大小(length)分配一个内存空间,然后使用 memcpy 将指向 pData的数据复制一份到 pBuffer中,然后使用 OleLoadPicture 加载 pBuffer的图片数据,这样竟然解决了在win7下的问题:

size_t length;PBYTE pData = MagickGetImageBlob(mw, &length); //从mw中读取完整的字节数组//printf("length:%d\n",length);//测试发现在 [windows 7旗舰版], CreateStreamOnHGlobal & OleLoadPicture 无法直接使用 pData,//经过各种尝试后,发现,可以申请一个临时的内存空间(pBuffer), 将 PData 复制一份到这个内存空间:pBuffer//然后使用 CreateStreamOnHGlobal & OleLoadPicture 处理 pBuffer 而不是 PDataHGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, length); //开辟一个内存空间LPVOID pDes = GlobalLock(pBuffer); //锁定内存空间memcpy(pDes,pData,length); //将 pData 的内容复制一份到 pBufferGlobalUnlock(pBuffer); //解锁内存空间IStream *pstream = NULL;if(CreateStreamOnHGlobal(pBuffer, FALSE, &pstream) == S_OK) //将字节数组转换成 IStream*{if(SUCCEEDED(OleLoadPicture(pstream, length, TRUE, &IID_IPicture, (void**)&pPic)))

2013-06-03

转载于:https://www.cnblogs.com/personnel/p/4584898.html

win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 0相关推荐

  1. 解决在Win7旗舰版下的安装问题

    2015年10月6日早上,我为在笔记本上安装VC2005折腾了近2个小时,终于安装成功,现将过程与有幸碰到同样问题的朋友们分享: 以前的安装方法不行了.本人安装VC2005应该也不小10次了,从未遇到 ...

  2. 如何在虚拟计算机添加3块硬盘,win7旗舰版下如何建立虚拟硬盘

    虚拟磁盘已经越来来贴近我们的生活了.最近有很多热心的网友问小编有没有建立虚拟硬盘的方法.下面小编就教给大家如何在win7旗舰版下如何建立虚拟硬盘.来满足大家对虚拟硬盘的需求.下面跟随小编来学习如何建立 ...

  3. win7计算机怎么优化驱动器,win7旗舰版系统如何进行系统内存优化

    1.右键单击桌面上的"计算机",在右键菜单栏中,选择"属性",如图1所示: 图1 计算机属性 2.在出现的窗口中,单击"高级系统设置",如图 ...

  4. Win7旗舰版下安装Sql2008

    由于项目关系,最近准备安装Sql2008.居然花了一周才将其安装好.......在此分享下成功经验. 机子简介:联想Y460系列 ,win7旗舰版32位. 注:在安装sql2008之前,机子上已经成功 ...

  5. 【java】springboot项目启动数据加载内存中的三种方法

    文章目录 一.前言 二.加载方式 2.1. 第一种:使用@PostConstruct注解(properties/yaml文件). 2.2. 第二种:使用@Order注解和CommandLineRunn ...

  6. win7旗舰版下使用EasyBCD安装Ubuntu

    本文参考 使用EasyBCD安装Win7和Ubuntu双系统 和 win7下通过easyBCD引导安装Ubuntu14.04 并亲自测试成功! 一.准备工作 1.下载镜像文件,我下载的是 ubuntu ...

  7. UGUI中动态加载图集中的图片(转)

    前言 图集打包的好处都有啥?不管你是新手还是大神,要是项目中ui图片很多,特别是小图很多,需要运行时动态加载或切换Image中的sprite的时候,基本上都会选择打包成图集这种解决方案. 图集的好处有 ...

  8. iOS中加载Flutter中的图片

    在 Flutter 插件开发中,有时需要将 Flutter 中配置的图片资源传递到 Android 或者是 iOS原生中,传递方法如下: //一般应用在Flutter 插件开发中 //注册插件的方法 ...

  9. WIN7旗舰版下安装SQL SERVER 2008安装报错解决方案

    在win7环境下,是完全可以解决SQL Server 2008兼容性问题的.本人在第一次安装时,遇到了几乎很多人安装过程中都会出现的问题.只好卸载了重新安装,第二次设置了一系列的东西,完全通过,安装成 ...

最新文章

  1. poj3216 Prime Path(BFS)
  2. 不能修改“System Roots”钥匙串
  3. python二维列表排序_使用Python按顺时针方向排序二维坐标列表?
  4. 2018年海南计算机职称考试,海南省2018年全国计算机等级考试报名时间
  5. 计算机组装维护文献,组装计算机论文,关于《计算机组装维护》课程教学相关参考文献资料-免费论文范文...
  6. 微信封杀下的互联网江湖
  7. c#ref和out的相同点_C#中ref和out的使用小结
  8. python画离散点_python 画散点图
  9. 新塘单片机烧写器_NuMicro ICP Programming Tool-ICP Programming Tool(新唐单片机烧录工具)下载 v3.00.6909官方版--pc6下载站...
  10. JS之 解决fakepath问题,并实现base64图片上传(单图上传)
  11. 网易云升级服务(云函数)
  12. 非编系统到底是什么意思呀?
  13. 解决创建MAVEN工程速度慢的问题
  14. H2O学习笔记(一)—— H2O概述
  15. 新手学习python零基础_一个零基础新手学习Python应该知道的学习步骤与规划
  16. word 保存时 不能保存
  17. 计算机网络校园局域网课题,选题表任务书(校园局域网的组建与维护).doc
  18. android菜单回弹,Android--实现ViewPager边界回弹效果(转)
  19. fmcw matlab仿真,基于SIMULINK的FMCW雷达测距功能仿真.pdf
  20. SN74LVC245ARGYR与SN74LVCH245ARGYR的区别

热门文章

  1. js取整、四舍五入等数学函数
  2. saltstack配置管理之YAML(二)
  3. MVC Filter
  4. 【转】TCP协议中的三次握手和四次挥手(图解)
  5. net-speeder 安装
  6. C#函数式程序设计之惰性列表工具——迭代器
  7. Nginx+lua 实现调用.so文件方法
  8. PostgreSQL 优化器代码概览
  9. 01.05第六周周总结
  10. 用cascade删除有约束的表或记录