昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出:
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
时间: 2024-11-03 22:02:00