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的图片数据呢?
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70763.html