制作:KrK (Knuth for Kludge)
#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);