Windowsコード集 上のページ

#0007 SUSIEプラグインサーチ

グラフィックビューアとして有名なフリーソフトウェアであるSUSIE(作者:たけちん氏)のプラグインを利用し、適切なプラグインを探す関数です。

このソースをコンパイルするときには、別途 spi_plugin.h が必要です。
// オープンマクロ
#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,"画像ファイル");
}


上のページ