win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0
昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出:
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 而不是 PData
HGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, length); //开辟一个内存空间
LPVOID pDes = GlobalLock(pBuffer); //锁定内存空间
memcpy(pDes,pData,length); //将 pData 的内容复制一份到 pBuffer
GlobalUnlock(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
win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0的更多相关文章
- Universal-Image-Loader解析(三)——用ListView和ViewPager加载网络中的图片
现在我们终于可以通过这个框架来实现ListView中加载图片了,至于ViewPager还是别的,原理其实都是一样的 一.ListView 1.布局文件 list_layout.xml & ...
- 如何在64位WIN7旗舰版下安装SQL2000
1>找到安装包下面的“DEVELOPER”或“ENTERPRISE”等下的X86\SETUP下的“SETUPSQL.EXE”,在安装前右键单击这个文 件, 1.1 打开“兼容性”标签,兼容模式选 ...
- win7旗舰版下配置IIS服务器
选择上述的插件后,Windows 需要更新一段时间,并重启电脑 测试是否安装成功:http://localhost 注意:默认端口号是 80,不能和tomcat 的 80 端口同时重启 常 ...
- Glide 4.0.0 下之加载本地缓存的图片
在网上搜了下,无意中发现RequestOptions还有个方法: onlyRetrieveFromCache 用了下是OK的 try { File imageFile = Glide.with(con ...
- iOS:延迟加载和上拉刷新/下拉加载的实现
lazy懒加载(延迟加载)UITableView 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要 ...
- [Android] Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.LoaderCallbacks)
Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.Lo ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值---部分内容可能不确切,待讨论
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...
- win7 32位支持多大内存|win7 32位旗舰版最多能识别多少内存
win7 32位支持多大内存|win7 32位旗舰版最多能识别多少内存 内存的大小决定系统运行速度,所以不少人认为只要内存加大就行了,其实这是不对的,因为win7 32位能支持的内存大小是有限制的,并 ...
- 联想电脑win7旗舰版环境下的如何成功配置AppServ
联想电脑win7旗舰版环境下的如何成功配置AppServ 毕业设计中需要用Mysql数据库,并且想找一个方便Mysql数据库编程的开发工具,百度搜索了一下,AppServ集成环境安装包能快速搭建环境. ...
随机推荐
- Bash 中常见的字符串操作
获取字符串长度 ${#string} MyString=abcABC123ABCabc 注意这会自动去掉字符串结尾处的空格,如果在字符串中包含空格(开头.中间或结尾),就需要使用引号把字符串包裹起来: ...
- python基础学习笔记(四)
列表 本节继续讨论列表不同元组和字符串的地方:列表是可变的(mutable)----可以改变列表的内容,并且列表有很多有用的.专门的方法. List函数可以将一个字符串拆分成列表. >>& ...
- apacheTomcat
Window+R ------>cmd || Window PowerShell apacheTomcat\bin> ./startup.sh
- #个人博客作业week3——微软必应词典的使用
产品的调研和评测 笔者使用的是win8的必应词典客户端. 首先打开客户端,用户界面的设计十分简洁,使用方便.但是词典主页与大多外语软件的设计相仿,例如有每日一句,每日阅读等模块,并没有令人感到新奇的地 ...
- 《Linux内核分析》第七周学习笔记
<Linux内核分析>第七周学习笔记 可执行程序的装载 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...
- Maven+SSM整合.doc
Maven + SSM整合 1开发环境搭建 1.1Eclipse4.7(Oxygen) + Tomcat8 + Maven3.5.2 2Maven Web项目创建 2.1新建maven项目 2.2 选 ...
- python3_字符串
一.字符串的表示 >>> s = "narjaja never give up" #字符串的创建和初始化 >>> s = 'narjaja ne ...
- Qt__事件处理机制
一.Qt事件 Qt会将系统消息(如鼠标按键.键盘按键等)转化为Qt事件,Qt事件被封装为对象且定义该对象的类均继承自抽象类QEvent. 二.Qt事件的产生 1.操作系统产生 Spontaneous ...
- fasterxml.jackson 将对象转换为json报错处理
最近在做查询的数据遇到如下报错: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found ...
- html 统一资源定位器(url)和url编码
url,即统一资源定位器,也叫网址. 点击<a>标签就会连接到url指定的服务器web资源,文档或者其它数据: url的命名规则:url可是域名或者IP地址 url="shcem ...