OLEを使ってHBITMAPを取得

制作:KrK (Knuth for Kludge)

情報・ご感想はこちら

KrK's Cracked Text > はしくれコード


環境

ソース


#include <windows.h>    // Win32API
#include <olectl.h>     // OLE

//---------------------------------------------------------------------
// OLEを使ってHBITMAPを取得
// 作成 20140816 KrK
// 引数 filename:ファイル名
// 戻り値:ビットマップハンドル
//---------------------------------------------------------------------
HBITMAP LoadByOLE(WCHAR *filename)
{
  OLE_HANDLE hOle;          // OLEハンドル
  IStream *iStream = NULL;  // ストリームオブジェクト
  IPicture *iPicture;       // 画像
  HGLOBAL hMem;             // メモリハンドル
  LPVOID pData;             // 画像データ
  DWORD readByte;           // 読んだサイズ
  DWORD fileSize;           // ファイルサイズ
  HANDLE hFile;             // ファイルハンドル
  short type;               // データ種類
  HRESULT rc;               // 処理結果

  // ファイルを開く
  hFile = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
  fileSize = GetFileSize(hFile, NULL);
  hMem = GlobalAlloc(GMEM_MOVEABLE, fileSize);
  pData = GlobalLock(hMem);

  // データ生成
  ReadFile(hFile, pData, fileSize, &readByte, NULL);
  GlobalUnlock(hMem);
  CloseHandle(hFile);

  // ストリーム生成
  CreateStreamOnHGlobal(hMem, TRUE, &iStream);
  rc = OleLoadPicture(iStream, fileSize, FALSE, IID_IPicture,
    (LPVOID*)&iPicture);
  iStream->Release();
  GlobalFree(hMem);

  // 取得できなかった
  if (rc != S_OK)
  {
    return NULL;
  }

  // 画像取得
  iPicture->get_Type(&type);
  if (type == PICTYPE_BITMAP)
  {
    iPicture->get_Handle(&hOle);
    return (HBITMAP)hOle;
  }
  else
  {
    return NULL;
  }
}

使い方


HBITMAP hBmp;               // ビットマップハンドル
WCHAR filename[_MAX_PATH];  // ファイル名

// ビットマップを読み込む
hBmp = LoadByOLE(filename);

(中略)

// 開放
DeleteObject(hBmp);

使用条件


免責事項