;================================================================================ ;モジュール llmod ;ver 1.11 ; loadlib.dllを使うモジュール ;================================================================================ ;使い方 ;================================================================================ ; getptr v1,v2 ; ; v1 : ポインタを入れる変数 ; v2 : ポインタを取得する変数 ;================================================================================ ; ;<>説明 ; v2に指定した変数のポインタをv1に代入します。 ; ;================================================================================ ; dllproc "s1",v2,n3,n4 ; ; s1 : 関数名 ; v2 : 関数に渡す引数が入った数値変数 ; n3 : 引数の数 ; n4 : ll_libloadでロードしたdllのハンドル ;================================================================================ ; ;<>説明 ; n4に指定したdll内のs1の関数を使用します。 ; 関数の返り値はグローバル変数dllretに代入されます。 ; llmod内では主用なdllがロードされていて、そのdllを使用する場合は ; 以下の数値を使って関数を使用できます。 ; DLL名 ; kernel32.dll 0 (D_KERNEL) ; user32.dll 1 (D_USER) ; shell32.dll 2 (D_SHELL) ; comctl32.dll 3 (D_COMCTL) ; comdlg.dll 4 (D_COMDLG) ; gdi32.dll 5 (D_GDI) ; ;<>例 ;(1) ; ll_libload dll,"user32" ;user32.dllをロード ; s="test" ; getptr p,s ; prm=0,p,p,0 ; dllproc "MessageBoxA",prm,4,dll ; mes dllret ; ll_libfree dll ; ;(2) ; s="test2" ; getptr p,s ; prm=0,p,p,0 ; dllproc "MessageBoxA",prm,4,D_USER ; mes dllret ; ;#uselib "loadlib.dll" ;#func ll_getptr ll_getptr 1 ;#func ll_peek ll_peek 1 ;#func ll_peek1 ll_peek1 1 ;#func ll_peek2 ll_peek2 1 ;#func ll_peek4 ll_peek4 1 ;#func ll_poke ll_poke 1 ;#func ll_poke1 ll_poke1 0 ;#func ll_poke2 ll_poke2 0 ;#func ll_poke4 ll_poke4 0 ;#func ll_libload ll_libload 5 ;#func ll_libfree ll_libfree 0 ;#func ll_getproc ll_getproc 5 ;#func ll_callfunc ll_callfunc 1 ;#func ll_callfnv ll_callfnv 0 ;#func ll_retset ll_retset 1 ;#func ll_bin ll_bin $87 ;#func ll_str ll_str $83 ;dllproc用 #define global D_KERNEL 0 #define global D_USER 1 #define global D_SHELL 2 #define global D_COMCTL 3 #define global D_COMDLG 4 #define global D_GDI 5 ;グローバル変数 dllret=0 ;module初め>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #module "llmod" ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;dll_getfunc ;................................................................................ #deffunc dll_getfunc val,str,int mref _v1,16 ;func mref _v2,33 ;funcname mref _v3,2 ;dll if _v3 & $ffffff00 = 0 : _v3=mjrdll._v3 ll_getproc@ _v1,_v2,_v3 if _v1=0 : dialog "can not find '"+_v2+"'\ndll="+_v3 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;getptr ;getptr p,var ;変数varのポインタをpに代入 ;................................................................................ #deffunc getptr val,val mref _v1,16 ;pointer mref _v2,1025 ;var if (_v2&$ffff=2) : mref _v3,25 : else mref _v3,17 ll_getptr@ _v3 _v1=dllret@ return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_init_llmod ;よく使うDLLをロードしておく ;(LoadLibraryでloadしたDLLはHSP終了時に自動的に開放される) ;................................................................................ #deffunc _init_llmod if mjrdll : return sdim lcl_s,64,16 ll_retset@ dllret@ lcl_s.D_KERNEL ="kernel32" lcl_s.D_USER ="user32" lcl_s.D_SHELL ="shell32" lcl_s.D_COMCTL ="comctl32" lcl_s.D_COMDLG ="comdlg32" lcl_s.D_GDI ="gdi32" repeat 6 ll_libload@ mjrdll.cnt,lcl_s.cnt loop #define F_SendMessage 0 #define F_CreateWindowEx 1 #define F_GetActiveWindow 2 lcl_s="SendMessageA","CreateWindowExA","GetActiveWindow" repeat 3 ll_getproc@ mjrfunc.cnt, lcl_s.cnt, mjrdll.D_USER loop alloc lcl_s,64 mref stt,64 ;変数sttはここでstat扱いにしておく gosub _init_obj_hnds ;※ _cls用 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;dllproc ;................................................................................ #deffunc dllproc str,val,int,int mref funcname,32 mref prms,17 mref prm_n,2 mref dll_no,3 if dll_no & $ffffff00 : dllret@=dll_no : else dllret@=mjrdll.dll_no ll_getproc@ func,funcname,dllret@ if func { ll_callfunc@ prms,prm_n,func stt=dllret@ } else { dialog "can not find '"+funcname+"'\ndll="+dll_no getkey a, 16 : if a : end } return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;getmjrdll ;................................................................................ #deffunc getmjrdll val,int mref v1,16 mref v2,1 v1=mjrdll.v2 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;getmjrfunc ;................................................................................ #deffunc getmjrfunc val,int mref v1,16 mref v2,1 v1=mjrfunc.v2 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_init_obj_hnds ;Windowハンドルの初期化(_cls用) ;................................................................................ *_init_obj_hnds alloc obj_hnds,4*64 ;HSPと同じ64個までにしておく ;ただし1つ1つのウィンドウではなく全てのウィンドウで64個 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_cls ;モジュールで作ったcontrolとHSPのオブジェクトを全てクリアする ;................................................................................ #deffunc _cls int mref v1 func=mjrfunc.F_SendMessage prm.1=16,0,0 repeat 64 prm=obj_hnds.cnt if prm : ll_callfunc@ prm,4,func loop gosub _init_obj_hnds cls v1 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_get_instance ;instanceの取得 ;................................................................................ #deffunc _get_instance val mref v1,16 mref bmscr,67 v1=bmscr.14 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_get_active_window ;active windowの取得 ;................................................................................ #deffunc _get_active_window val mref v1,16 ll_callfnv@ mjrfunc.F_GetActiveWindow v1=dllret@ return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;sendmsg ;SendMessage ;................................................................................ #deffunc sendmsg val mref v1,16 ll_callfunc@ v1,4,mjrfunc.F_SendMessage stt=dllret@ return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;setwndlong ;SetWindowLong ;................................................................................ #deffunc setwndlong val,int mref v1,16 mref v2,1 ;#define GWL_WNDPROC (-4) ;#define GWL_HINSTANCE (-6) ;#define GWL_HWNDPARENT (-8) ;#define GWL_STYLE (-16) ;#define GWL_EXSTYLE (-20) ;#define GWL_USERDATA (-21) ;#define GWL_ID (-12) if v2 { lcl_s="G" : a=2 ;GetWindowLongにする (節約) } else { lcl_s="S" : a=3 ;SetWindowLongにする (節約) } lcl_s+="etWindowLongA" dllproc lcl_s,v1,a,D_USER return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_null_sep_str ;................................................................................ #deffunc _null_sep_str val,int mref v1,24 mref v2,1 strlen L,v1 : a=0 : prm=0 repeat L peek a,v1,cnt if a=v2 : poke v1,cnt,0 : prm+ loop stt=prm return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_makewnd ;CreateWindowEx ;................................................................................ #deffunc _makewnd val,str mref handle,16 ;ハンドルを入れる変数 ;handle.0 x座標 handle.1 y座標 ;handle.2 幅 handle.3 高さ ;handle.4 スタイル ;handle.5 親ウィンドウのハンドル ;handle.6 dwExStyle ;が入っている mref s2,33 ;classname mref bmscr,67 obj_hnds_n=-1 repeat 64 if obj_hnds.cnt=0 : obj_hnds_n=cnt : break loop if obj_hnds_n=-1 : stt=-1 : return ;※ _cls用 if handle.2=0 : handle.2=bmscr.29 if handle.3=0 : handle.3=bmscr.30 prm=handle.6 ;dwExStyle lcl_s=s2 getptr prm.1,lcl_s lcl_s2="" getptr prm.2,lcl_s2 prm.3=handle.4, handle.0 ,handle.1 , handle.2 ,handle.3 , 0,0,0,0 if handle.5 : prm.8=handle.5 : else prm.8=bmscr.13 ;parent window _get_instance prm.10 ll_callfunc@ prm,12,mjrfunc.F_CreateWindowEx handle=dllret@ obj_hnds.obj_hnds_n=handle ;※ _cls用 if prm.763) : stt=0 : else { v1 +=41 stt=bmscr.v1 } return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_hspobjid ;ハンドルからHSPのObjectIDを調べてstatに代入 ;................................................................................ #deffunc _hspobjid int mref v1 ;handle of window mref bmscr,67 stt=-1 repeat 64,41 if bmscr.cnt=v1 : stt=cnt-41 : break loop return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_objsel ;................................................................................ #deffunc _objsel int mref v1 ;hwnd if v1=-1 { ;ver 1.1〜 mref bmscr,67 dllproc "GetFocus",a,0,D_USER if stat=bmscr.13 : stt=-1 : return a=stat _hspobjid a if stat!-1 : a=stat stt=a }else{ a=v1 _hspobjhandle a if stat : a=stat dllproc "SetFocus",a,1,D_USER } return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_clrobj ;................................................................................ #deffunc _clrobj int,int mref v1,0 ;hwnd mref v2,1 a=v1 _hspobjhandle a if stat : clrobj v1 : return ;#define WM_CLOSE 16 prm=a,16,0,0 ll_callfunc@ prm,4,mjrfunc.F_SendMessage repeat 64 if obj_hnds.cnt=a : obj_hnds.cnt=0 : break loop stt=dllret@ return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;charupper ;変数内の英字を大文字に変換 ;................................................................................ #deffunc charupper val mref v1,1024 dllproc "CharUpperA",v1.7,1,D_USER return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;charlower ;変数内の英字を小文字に変換 ;................................................................................ #deffunc charlower val mref v1,1024 dllproc "CharLowerA",v1.7,1,D_USER return #undef F_SendMessage #undef F_CreateWindowEx #undef F_GetActiveWindow ;module終わり>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #global _init_llmod ;139行 よく使うDLLをロードしておく