2006/05/17(水)susie32 plugin モジュール
susie plug-in をHSP3から利用するモジュール。
ぷましゃんのやつと比べて、
短所はパレットモードに対応していない。
長所はDPMファイル内の画像データも読み込める(はず)。
まぁ、なんつかどうでもいいですね。
コレを作るのに徹夜まがいなことをしてしまい、今もなかなか(というかかなり)眠いです。
このモジュールはスクリプトに組み込んで自由に使用できます。
#module #uselib "kernel32.dll" #cfunc LoadLibrary "LoadLibraryA" sptr #cfunc GetProcAddr "GetProcAddress" int,sptr #cfunc LocalLock "LocalLock" int #func LocalUnlock "LocalUnlock" int #func LocalFree "LocalFree" int #func VirtualProtect "VirtualProtect" var, int, int, var #define mdim(%1,%2)dim %1,%2 :VirtualProtect %1,(%2)*4,$40,AZSD #uselib "gdi32.dll" #func SetDIBitsToDevice "SetDIBitsToDevice" \\ int,int,int,int,int,int,int,int,int,int,int,int #deffunc GetBmpSize str fn, array val_sz, local bmpsz bmpsz = 0,0,0 bload fn,bmpsz, 12,14 if bmpsz = 40 : val_sz = bmpsz.1, bmpsz.2 : return 0 if bmpsz = 12 : val_sz = wpeek(bmpsz,4), wpeek(bmpsz,6) : return 1 return -1 ;// 初期化 #deffunc _spi_init LoadedPlugins = 0 mdim cbfunc,2 cbfunc = 0x0CC2C033,0x00000000 ;// xor eax,eax : ret 12 pfnCallback = varptr(cbfunc) return ;// 単一DLL読み込み #deffunc spi_Load str _dllname, local hDll ,\\ local pfn, local prm, local ret hDll = LoadLibrary(_dllname) if hDll = 0 : return -1 ;// Load失敗 pfn = GetProcAddr(hDll,"GetPluginInfo") if pfn = 0 : return -2 ;// susie pluginじゃない sdim buf,256 prm = 0,varptr(buf), 256 ret = callfunc(prm,pfn,3) ;// 4E493030 = '00IN' 画像読み込みプラグインじゃない if lpeek(buf,0) != 0x4E493030 : return -3 hModule.LoadedPlugins = hDll LoadedPlugins++ return 0 ;// フォルダ内DLL全読み込み #deffunc spi_LoadAll str _dlldir ,local curdir, local rdptr, local list, local dllfn curdir = dir_cur : chdir _dlldir rdptr = 0 dirlist list, "*.spi" repeat stat getstr dllfn,list,rdptr : rdptr += strsize spi_Load dllfn loop chdir curdir return LoadedPlugins #defcfunc spi_IsSupported int _hModule, str _filename, int _dw, local fn, \\ local pfn, local prm, local ret fn = _filename pfn = GetProcAddr(_hModule,"IsSupported") if pfn = 0 : return 0 prm = varptr(fn), _dw return callfunc(prm,pfn,2) #deffunc spi_GetPicture int _hModule, int _buf, int _len, int _mode ,\\ local pfn, local prm, local ret pfn = GetProcAddr(_hModule,"GetPicture") ;LPSTR buf, long len, unsigned int 1, HANDLE *pHBInfo, HANDLE *pHBm, pfnCallback, 0 prm = _buf, _len, 1, varptr(HBi), varptr(HBm), pfnCallback, 0 ret = callfunc(prm,pfn,7) if ret ! 0 : return ret pbi = LocalLock(HBi) pbm = LocalLock(HBm) dupptr bi,pbi+4,8,vartype("int") w = bi.0 h = bi.1 curgsel = ginfo_sel repeat 1 if _mode ! 0 : break mref bmscr,67 ;// ぷましゃんスクリを参考にしてみた if bmscr.17=1 : buffer ginfo_sel, w, h : break if bmscr.17=2 : screen ginfo_sel, w, h, bmscr.19&$ffff<<1 : break bgscr ginfo_sel, w, h, 0 loop SetDIBitsToDevice hdc,ginfo_cx,ginfo_cy,w,h,0,0,0,h,pbm,pbi,0 redraw LocalUnlock HBi LocalUnlock HBm LocalFree HBi LocalFree HBm return 0 ;// 画像ロード ファイル名, picload モード ;// ……とてつもなく中途半端 #deffunc spi_Picload str _fn, int _mode, local fn ,\\ local pfn, local prm, local ret fn = _fn exist fn : if strsize = -1 : return -1 : else : sz = strsize if getpath(fn,18)=".bmp" : picload fn,_mode : return 0 ret = -2 sdim filebuffer,sz bload fn,filebuffer repeat LoadedPlugins if spi_IsSupported(hModule.cnt, fn, varptr(filebuffer)) { spi_GetPicture hModule.cnt, varptr(filebuffer), sz, _mode if stat = 0 { ret = 0 : break } } if spi_IsSupported(hModule.cnt, fn, varptr(filebuffer)+128) { spi_GetPicture hModule.cnt, varptr(filebuffer)+128, sz-128, _mode if stat = 0 { ret = 0 : break } } loop return ret #global _spi_init ////////////////////////////////////////////////// spi_LoadAll "." ;// カレントフォルダのDLL全読み込み chdir "e:\\my documents\\My Pictures" spi_Picload "ccsakura_0800.jpg";// 画像ロード ;// stat=0なら成功、-1ならファイルが見つからない、-2はそれ以外のエラー