为什么我每次调用Bitmap::Save总是返回Status Win32Error = 7呢?
以下是程序启动的时候TRACE出来的Encoder信息
前面是Encoder名字,后面是对应的CLSID:
image/bmp:{557CF400-1A04-11D3-9A73-0000F81EF32E}
image/jpeg:{557CF401-1A04-11D3-9A73-0000F81EF32E}
image/gif:{557CF402-1A04-11D3-9A73-0000F81EF32E}
image/tiff:{557CF405-1A04-11D3-9A73-0000F81EF32E}
image/png:{557CF406-1A04-11D3-9A73-0000F81EF32E}
以下是Save的时候的TRACE信息
image/bmp:{557CF400-1A04-11D3-9A73-0000F81EF32E}
以下是Save时的代码:
Status stat = m_pSelectedImage->Save(wstrEncoder.c_str(), &clsid, NULL);
if(stat == Ok)
   TRACE("Current Image was saved successfully\n");
else
   TRACE("Failure: stat = %d\n", stat);
结果每次输出:
Failure: stat = 7
让我很郁闷。

解决方案 »

  1.   

    看看下面的代码有没有帮助
    #include <Stdio.h>
    #include <Objbase.h>
    #include <Windows.h>
    #include <Gdiplus.h>
    #include <GdiPlusEnums.h>
    using namespace Gdiplus;
    #pragma comment(lib,"gdiplus")
    // Helper functions
    int GetCodecClsid(const WCHAR*, CLSID*);
    HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW)
    {
        ULONG cCharacters;
        DWORD dwError;
        if (NULL == pszA)
        {
            *ppszW = NULL;
            return NOERROR;
        }
        cCharacters =  strlen(pszA)+1;
        *ppszW = (LPOLESTR) CoTaskMemAlloc(cCharacters*2);
        if (NULL == *ppszW)
            return E_OUTOFMEMORY;
        if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters,*ppszW, cCharacters))
        {
            dwError = GetLastError();
            CoTaskMemFree(*ppszW);
            *ppszW = NULL;
            return HRESULT_FROM_WIN32(dwError);
        }    return NOERROR;
    }
    int main(int argc, char* argv[])
    {
    int n_ret=0;
    printf("%s can convert jpg, png, gif, tiff to bmp file.\n if it works, it is written by masterz, otherwise I don't know who write it",argv[0]);
    if(argc!=3)
    {
    printf("usage:%s bmp_filename source_image_filename\n",argv[0]);
    return -1;
    }
    GdiplusStartupInput gdiplusStartupInput; 
    ULONG gdiplusToken; 
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 
    {
    CLSID              codecClsid;
    Status             stat;
    EncoderParameters  encoderParameters; GetCodecClsid(L"image/bmp", &codecClsid);
    encoderParameters.Count = 0;
    LPOLESTR bstr_src_img;
    LPOLESTR bstr_dst_bmp;
    AnsiToUnicode(argv[1],&bstr_dst_bmp);
    AnsiToUnicode(argv[2],&bstr_src_img);
    Image image(bstr_src_img);
    stat =image.Save(bstr_dst_bmp, &codecClsid, &encoderParameters);
    if(stat == Ok)
    {
    n_ret=0;
    wprintf(L"%s saved successfully.\n",bstr_dst_bmp);
    }
    else
    {
    n_ret=-2;
    wprintf(L"%d  Attempt to save %s failed.\n", stat, bstr_dst_bmp);
    }
    CoTaskMemFree(bstr_dst_bmp);
    CoTaskMemFree(bstr_src_img);
    }
    GdiplusShutdown(gdiplusToken);
    return 0;
    } // main
    int GetCodecClsid(const WCHAR* format, CLSID* pClsid)
    {
       UINT  num = 0;          // number of image encoders
       UINT  size = 0;         // size of the image encoder array in bytes   ImageCodecInfo* pImageCodecInfo = NULL;   GetImageEncodersSize(&num, &size);
       if(size == 0)
          return -1;  // Failure   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
       if(pImageCodecInfo == NULL)
          return -1;  // Failure   GetImageEncoders(num, size, pImageCodecInfo);   for(UINT j = 0; j < num; ++j)
       {
          if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
          {
             *pClsid = pImageCodecInfo[j].Clsid;
             return j;  // Success
          }    
       } // for   return -1;  // Failure} // GetCodecClsid
    //sample usage: img2bmp a.bmp b.gif
      

  2.   

    Thank you very much. I have found the error in my code. I have used a wrong file name.