This repository was archived by the owner on Mar 7, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathllmod.as
executable file
·491 lines (383 loc) · 11.9 KB
/
llmod.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
;================================================================================
;モジュール 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.7<bmscr.31 : a=bmscr.31 : else a=prm.7
pos csrx, csry+a ;カレントポジションを設定
prm=handle,-12,0x1000+obj_hnds_n
setwndlong prm ;control IDをhandleと同じ値にする
stt=0
return
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;_is_wnd
;................................................................................
#deffunc _is_wnd int
mref v1
dllproc "IsWindow",v1,1,D_USER
return
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;_hspobjhandle
;HSPのObjectIDからハンドルを調べてstatに代入
;................................................................................
#deffunc _hspobjhandle int
mref v1 ;HSPのオブジェクトのID
mref bmscr,67
if (v1<0)|(v1>63) : 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をロードしておく