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);

使用条件


免責事項