基本的にはPlug-In Packageに入っているSPI_API.txtを読めばわかります。 私はLoadLibraryとGetProcAdressを使用してSusiePlugInを使用しています。 ////////////////////////////////////////////////////////////////////////////// SpiFileNameをSusie Plug Inのファイル名とすると Spiの情報の確保は以下のようになります。 HINSTANCE hLibrary; CHAR ApiVersion[20]; CHAR PlugInName[200]; typedef int (CALLBACK* LPGETPLUGININFOFUNC)(int,LPSTR,int); LPGETPLUGININFOFUNC lpGetPluginInfo; hLibrary=LoadLibrary(SpiFileName); lpGetPluginInfo=(LPGETPLUGININFOFUNC)GetProcAddress(hLibrary,"GetPluginInfo"); //Spiのバージョン"00IN","00AM"などの取得 lpGetPluginInfo(0,ApiVersion,10); //Spiの説明 lpGetPluginInfo(3,PlugInName,100); INT i=0; CHAR SusieDllSupport[30][100]; //対応するファイル名の情報を確保 while(lpGetPluginInfo(2*i+2,SusieDllSupport[i],20)!=0) i++; FreeLibrary(hLibrary); ここで問題になるのは*.jpgにファイル名が対応しているが*.jpegに対応しているSpiがすくないということがあるので強引に*.jpgに対応している場合には*.jpegにも対応させるということが必要になります ////////////////////////////////////////////////////////////////////////////// Spiの実際の使用方法は以下のようになります。 上で使用したコードの変数をそのまま使用します。 HINSTANCE hLibrary; //Call Back関数を定義する typedef int (CALLBACK* LP_IS_SUPPORT)(LPSTR,DWORD); typedef int (CALLBACK* LP_GET_PICTURE_FUNC)(LPSTR,long,unsigned int,HANDLE *,HANDLE *,FARPROC,long); typedef int (CALLBACK* LP_GET_FILE_FUNC)(LPSTR,long,LPSTR,unsigned int,FARPROC,long); typedef int (CALLBACK* LP_GET_ARCHIVE_INFO_FUNC)(LPSTR,long,unsigned int,HLOCAL *); typedef int (CALLBACK* LP_GET_PICTURE_INFO_FUNC)(LPSTR,long,unsigned int,struct PictureInfo *); typedef int (CALLBACK* LP_GET_FILE_INFO)(LPSTR,long,LPSTR,unsigned int,struct fileInfo *); 画像ファイルからの画像の確保の仕方は //まずSpiが"00IN"であることを確認 //FileNameが画像のファイル名です HANDLE hBitmapInfo; //LPBITMAPINFOのためのハンドル HANDLE hBitmapBitData; //LPSTR:BitmapのBitデータのためのハンドル if(strcmp(ApiVersion,"00IN")!=0) return; //SusieDllSupportとファイル名を比較して対応しているファイルかどうかのチェック //実際に書くとコードが長くなるので書きません。 hLibrary=LoadLibrary(SpiFileName); //データ自体が対応しているかどうかをIsSupportedで確認 CHAR FileHeadData[2000]; HANDLE FileHandle=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DWORD dwCanReadSize; 実際のファイルサイズが2000Byte以下の場合はそのファイルサイズのみをReadするように設定 ReadFile(FileHandle,FileHeadData,2000,&dwCanReadSize,0); lpIsSupport=(LP_IS_SUPPORT)GetProcAddress(hLibrary,"IsSupported"); //0が返ってきたら対応しているPlugInではないことをしめす //まず最初にFileHandleでしらべる if(lpIsSupport(FileName,(DWORD)FileHandle)==0) { //FileHandleで失敗した場合には確保したファイルのヘッダーでしらべる if(lpIsSupport(FileName,(DWORD)FileHeadData)==0) { CloseHandle(FileHandle); return; } } CloseHandle(FileHandle); lpGetPicture=(LP_GET_PICTURE_FUNC)GetProcAddress(hLibrary,"GetPicture"); lpGetPicture(FileName,0,0,(HANDLE *)&hBitmapInfo,(HANDLE *)&hBitmapBitData,NULL,NULL); FreeLibrary(hSusiePlugIn); ここで問題になるのはLoadLibararyからGetPictureまでFreeLibraryでSPIを開放しないことです。 IsSupportedのあとにSPIを開放し、そのあとにふたたびLoadLibraryでSPIを確保およびGetPicture をしてもしっぱいすることがあります。 GetPictureを使用するときには実際はCallBack関数を使用し、どこまで進んだかを示すのが一般的です。 GetPictureの1番目の引数がメモリ上のデータの場合は以下のように成増 PictureFileSizeは画像データのサイズです。 lpGetPicture(BufferPointer,PictureFileSize,0x01,(HANDLE *)&hBitmapInfo,(HANDLE *)&hBitmapBitData,0,0); ////////////////////////////////////////////////////////////////////////////// //まずSpiが"00AM"であることを確認 //FileNameが圧縮ファイル名です HANDLE hBitmapInfo; //LPBITMAPINFOのためのハンドル HANDLE hBitmapBitData; //LPSTR:BitmapのBitデータのためのハンドル if(strcmp(ApiVersion,"00AM")!=0) return; //SusieDllSupportとファイル名を比較して対応しているファイルかどうかのチェック //実際に書くとコードが長くなるので書きません。 hLibrary=LoadLibrary(SpiFileName); //データ自体が対応しているかどうかをIsSupportedで確認 CHAR FileHeadData[2000]; HANDLE FileHandle=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DWORD dwCanReadSize; 実際のファイルサイズが2000Byte以下の場合はそのファイルサイズのみをReadするように設定 ReadFile(FileHandle,FileHeadData,2000,&dwCanReadSize,0); lpIsSupport=(LP_IS_SUPPORT)GetProcAddress(hLibrary,"IsSupported"); //0が返ってきたら対応しているPlugInではないことをしめす //まず最初にFileHandleでしらべる if(lpIsSupport(FileName,(DWORD)FileHandle)==0) { //FileHandleで失敗した場合には確保したファイルのヘッダーでしらべる if(lpIsSupport(FileName,(DWORD)FileHeadData)==0) { CloseHandle(FileHandle); return; } } CloseHandle(FileHandle); lpGetArchiveInfo=(LP_GET_ARCHIVE_INFO_FUNC)GetProcAddress(hLibrary,"GetArchiveInfo"); lpGetFile=(LP_GET_FILE_FUNC)GetProcAddress(hLibrary,"GetFile"); HLOCAL hAllFileInfo; fileInfo lpAllFileInfo; //圧縮ファイル内の画像のファイル情報の確保 if(lpGetArchiveInfo(FileName,0,0,&hAllFileInfo)!=0) { //実際には失敗ですが0以外を返してきても確保が成功している場合があります return; } lpAllFileInfo=(struct fileInfo *)LocalLock(hAllFileInfo); INT j=0; //実際の画像のデータの確保 HANDEL BufferHandle; INT SuccessFlag; whlie((lpAllFileInfo+j)->method[0]=='\0') { //画像データの確保 //名前で確保 SuccessFlag=lpGetFile(FileName,(lpAllFileInfo+j)->position,(LPSTR)&BufferHandle,0x100,NULL,NULL); //実際にはここで確保したファイルを処理する j++; } LocalUnlock(lpAllFileInfo); LocalFree(hAllFileInfo); FreeLibrary(hLibrary); 実施にはGetFileはいったんメモリ上にデータを確保してそれをGetFileで処理するやり方もあります データをFileBufferData(データサイズは(lpAllFileInfo+j)->compsize)とすると。 SuccessFlag=lpGetFile(FileBufferData,(lpAllFileInfo+j)->compsize,(LPSTR)&BufferHandle,0x707,NULL,NULL); のようになります 時々引数の4番目が以下のようになるばあいもあります(これはSpi側の不具合ですが) SuccessFlag=lpGetFile(FileBufferData,(lpAllFileInfo+j)->compsize,(LPSTR)&BufferHandle,0x101,NULL,NULL); それで確保したデータを"00IN"のGetPicture関数で読み込ませるようにしてください。 ただしGetPicture関数では時々ファイル名指定での読み込みのみでメモリ上のデータを渡すと飛ぶ場合が有ります。