// オープンマクロ
#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))
//----------------------------------------------------------------------------
// 与えられたファイルに適したプラグインを取得する
//----------------------------------------------------------------------------
// BOOL WINAPI Spi_SearchPlugin(
// LPSTR searchpath, // プラグインのパス
// LPSTR filename, // 対象となる画像ファイル
// LPSTR retbuf // 見つかったプラグインを格納するポインタ
// );
//
// 関数が成功したときは、TRUEを返し、retbufにプラグインのパスを返す。
// 失敗したときもしくはプラグインが存在しないときは、FALSEを返す。
//----------------------------------------------------------------------------
#define SPI_CHECKREADSIZE 2048 // IsSupportedの仕様(2KB)に基づく先頭サイズ
BOOL WINAPI Spi_SearchPlugin(LPSTR searchpath,LPSTR filename,LPSTR retbuf)
{
// 画像ファイルの読みこみ
HANDLE fp;
DWORD fsize;
if((fp = CreateFile_Read(filename)) == INVALID_HANDLE_VALUE)return FALSE;
LPBYTE fsupp = (LPBYTE)Heap_Malloc(SPI_CHECKREADSIZE);
ReadFile(fp,fsupp,SPI_CHECKREADSIZE,&fsize,NULL);
CloseHandle(fp);
// SPIのサーチ
BOOL issupp = FALSE;
CHAR path[MAX_PATH],spipath[MAX_PATH];
WIN32_FIND_DATA item;
HINSTANCE inst;
SPI_ISSUPPORTED proc;
int len = strlen(strcpy(path,searchpath));
if(len > 0){
if(path[len - 1] != '\\')strcat(path,"\\");
}
strcat(strcpy(spipath,path),"*.spi");
if((fp = FindFirstFile(spipath,&item)) != INVALID_HANDLE_VALUE){
do{
strcat(strcpy(spipath,path),item.cFileName);
if((inst = LoadLibrary(spipath)) != NULL){
if((proc = (SPI_ISSUPPORTED)GetProcAddress(inst,SPIPROC_ISSUPPORTED)) != NULL){
if(proc(filename,(DWORD)fsupp) != 0){
strcpy(retbuf,spipath);
issupp = TRUE;
}
}
FreeLibrary(inst);
if(issupp)break;
}
}while(FindNextFile(fp,&item));
FindClose(fp);
}
// fsuppの開放
Heap_Free(fsupp);
return issupp;
}
#0006の関数を組み合わせて以下のようにすると、プラグインを知らなくても画像がロードできるようになります。
CHAR spipath[MAX_PATH];
HBITMAP bmp;
if(Spi_SearchPlugin("spiのパス","画像ファイル",spipath)){
bmp = Spi_LoadImage(spipath,"画像ファイル");
}