GDI+を使用したファイルの読み込みについて

解決


うい  2009-06-02 22:29:03  No: 70237  IP: [192.*.*.*]

環境はVisualStudio.NET2003,WindowsXPです。
下記のソースでGetImageEncodersSize(&num, &size);
の所でおちています。
GetEncoderClsid関数はファイルの種類を
決めるためのものだと解釈しています。
前後で何か必要な処理があるのでしょうか。
ヒントでもいいので、よろしくお願い致します。

参考HP
http://d.hatena.ne.jp/s0u/20080211/1202679717

//OKボタンクリック
void CTestJpegDlg::OnBnClickedOk()
{
  CLSID     encoderClsid;
  GetEncoderClsid(L"image/jpeg", &encoderClsid);

  OnOK();
}

int CTestJpegDlg::GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {
   UINT  num = 0;
   UINT  size = 0;
   ImageCodecInfo* pImageCodecInfo;
   GetImageEncodersSize(&num, &size);
   if(size == 0)
      return -1;
   pImageCodecInfo = (ImageCodecInfo*)new char[size];
   if(pImageCodecInfo == NULL)
      return -1;
   GetImageEncoders(num, size, pImageCodecInfo);
   for(UINT n=0; n<num; ++n) {
      if( wcscmp(pImageCodecInfo[n].MimeType, format) == 0 ) {
         *pClsid = pImageCodecInfo[n].Clsid;
         delete pImageCodecInfo;
         return n;
      }
   }
   delete pImageCodecInfo;
   return -1;
}

編集 削除
subaru  2009-06-03 11:00:59  No: 70238  IP: [192.*.*.*]

GDI+の関数を呼び出しただけで強制終了するようなら
単にGDI+の初期化を行っていないか
GDI+の初期化に失敗している可能性が考えられます。

編集 削除
うい  2009-06-03 20:42:04  No: 70239  IP: [192.*.*.*]

返信ありがとうございます。

初期化処理が行われていませんでした。
//GDI+の初期化
GdiplusStartup(&m_Token, &m_StartupInput, NULL);
UINT size = 0;
GetImageEncodersSize(&m_NumEncoders, &size);
の初期化処理を追加することで解決できました。
ありがとうございます。

編集 削除
うい  2009-06-03 20:42:06  No: 70240  IP: [192.*.*.*]

返信ありがとうございます。

初期化処理が行われていませんでした。
//GDI+の初期化
GdiplusStartup(&m_Token, &m_StartupInput, NULL);
UINT size = 0;
GetImageEncodersSize(&m_NumEncoders, &size);
の初期化処理を追加することで解決できました。
ありがとうございます。

編集 削除
うい  2009-06-03 20:42:48  No: 70241  IP: [192.*.*.*]

解決のチェックを立てました。

編集 削除