zoukankan      html  css  js  c++  java
  • 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
    ",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

  • 相关阅读:
    oracle分区表总结
    Oracle AMDU用法
    sql_patch用法
    oracle resource_managed限制个人用户使用并行
    oracle 服务的故障转移测试
    RAC修改public ip,vip,priv_ip,sacn_ip
    oracle tfactl使用 TFA
    oracle dbms_metadata.get_ddl使用总结
    Oracle分析函数总结
    继承与接口的区别
  • 原文地址:https://www.cnblogs.com/personnel/p/4584898.html
Copyright © 2011-2022 走看看