- SUSIEプラグインの使い方のサンプル(VC++5用)は渡辺 裕朗(Hiroaki Watanabe)さんのページにあるのでそれを使う。これ以上無い位シンプルなMDIアプリで実に分かり易い。これのREADME.TXT&ソースを読めば大抵OK。以下はその説明メモ。
- アプリケーションクラスのpublicメンバーにCSPIControl m_SPIを追加
- 起動時に事前にDLLをロードするために
if(SPI.FindLibrary(szPath)<1)
return FALSE;
szPathにあるSPI(DLL)を読み込む
- 読みこめるファイルの種類一覧を取得(これは一枚)
CString strFilter = m_SPI.GetFileFilter();
strFilterをそのまま"ファイル開くダイアログ"のフィルターパラメータに使える
- 実際読む時は一枚読む毎に以下の処理を行う。
LPCTSTR lpszPathName;//ファイル名
HLOCAL m_hHDR; //BMPヘッダーのハンドル
HLOCAL m_hImage; //イメージハンドル
LPBITMAPINFO m_pHDR; //ヘッダーのアドレス
LPBYTE m_pImage;// イメージのアドレス
SpiPictureInfo m_SpiInfo;
if SPI.LoadPicture(lpszPathName, &m_hHDR, &m_hImage, &m_SpiInfo)!=ERR_NoError)
return FALSE;
m_pHDR = (LPBITMAPINFO)::LocalLock(m_hHDR);
m_pImage = (LPBYTE)::LocalLock(m_hImage);
でm_pHDRにBMPヘッダーへのポインタ、m_pImageでイメージデータへのポインタが入る…って事は、ヘッダー、イメージ領域のメモリーはDLL側で確保してくれる。開放は後で自分で行う。
ヘッダー領域とイメージ領域は別々のアドレスに確保される。ヘッダーの直後にイメージデータが続く古いタイプのDIBを前提にしてプログラミングしてはならない。
- 上記の処理で使ったメモリの開放を一枚の処理の終わりに行う。
if(m_pHDR)
::LocalUnlock(m_hHDR);
if(m_pImage)
::LocalUnlock(m_hImage);
if(m_hHDR)
::LocalFree(m_hHDR);
if(m_hImage)
::LocalFree(m_hImage);
if(m_SpiInfo.hInfo)
::LocalFree(m_SpiInfo.hInfo);