// オープンマクロ
#define CreateFile_Read(filename) (CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))
#define CreateFile_Create(filename) (CreateFile(filename,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL,NULL))
#define CreateFile_Write(filename) (CreateFile(filename,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))
// ヒープマクロ
#define Heap_Malloc(size) (HeapAlloc(GetProcessHeap(),0,size))
#define Heap_ReAlloc(mem,size) (HeapReAlloc(GetProcessHeap(),0,mem,size))
#define Heap_Free(mem) (HeapFree(GetProcessHeap(),0,mem))
//----------------------------------------------------------------------------
// SUSIEプラグインを使った画像のロード
//----------------------------------------------------------------------------
// HBITMAP Spi_LoadImage(
// LPSTR plugin, // SUSIEプラグイン(*.spi)のファイルパス名
// LPSTR filename // ロードするファイルパス名
// );
//
// 関数が成功したときロードした画像のBITMAPハンドルを返す。
// 失敗したときは、NULLを返す。
//----------------------------------------------------------------------------
HBITMAP Spi_LoadImage(LPSTR plugin,LPSTR filename)
{
// プラグインのロード
HMODULE module = NULL;
if((module = LoadLibrary(plugin)) == NULL)return NULL;
// プラグイン関数の取得
SPI_ISSUPPORTED spi_issupported = (SPI_ISSUPPORTED)GetProcAddress(module,SPIPROC_ISSUPPORTED);
SPI_GETPICTURE spi_getpicture = (SPI_GETPICTURE )GetProcAddress(module,SPIPROC_GETPICTURE);
if(spi_issupported == NULL || spi_getpicture == NULL){
FreeLibrary(module);
return NULL;
}
// ファイル内容をロードする
HANDLE handle = NULL;
if((handle = CreateFile_Read(filename)) == INVALID_HANDLE_VALUE){
FreeLibrary(module);
return NULL;
}
DWORD filesize = GetFileSize(handle,NULL),readsize;
LPSTR data = (LPSTR)Heap_Malloc(filesize);
SetFilePointer(handle,0,NULL,FILE_BEGIN);
if(!ReadFile(handle,data,filesize,&readsize,NULL)){
CloseHandle(handle);
FreeLibrary(module);
}
CloseHandle(handle);
// ロードできる形式かどうかをチェックする
if(spi_issupported(filename,(DWORD)data) == 0){
Heap_Free(data);
FreeLibrary(module);
return NULL;
}
// 画像を展開する
HLOCAL info,bm;
if(spi_getpicture(data,filesize,1,&info,&bm,NULL,0) != 0){
Heap_Free(data);
FreeLibrary(module);
return NULL;
}
LPBITMAPINFO bmpinfo = (LPBITMAPINFO)LocalLock(info); // BITMAPINFO構造体
LPBYTE bmbits = (LPBYTE)LocalLock(bm); // 画像データ
// 取得した情報からBITMAPハンドルを生成する
HDC dc = GetDC(0);
HBITMAP bitmap = CreateDIBitmap(dc,&bmpinfo->bmiHeader,CBM_INIT,bmbits,bmpinfo,DIB_RGB_COLORS);
ReleaseDC(0,dc);
// いろいろと開放
LocalUnlock(info);
LocalFree(info);
LocalUnlock(bm);
LocalFree(bm);
Heap_Free(data);
FreeLibrary(module);
return bitmap;
}