オブジェクトの情報を取得する †
ここではオブジェクトの情報を管理するHSPOBJINFO構造体の内容を取得してみようと思います。
Borland Delphi 6 Personal
- スクリプトに
と書くと指定したオブジェクトのウィンドウテキストをメッセージボックスに表示する。
- HSPOBJINFO構造体の取得方法を学ぶ。
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
| | library objtext;
uses
Windows, hsp3plugin in '..\hsp3plugin.pas';
function cmdfunc(cmd: Integer): Integer; cdecl;
var
objinf: HSPOBJINFO; bm: PBMSCR; text: PChar;
len: Integer;
id: Integer;
begin
exinfo.HspFunc_prm_next;
case cmd of
$00: begin
id := exinfo.HspFunc_prm_geti;
bm := exinfo.HspFunc_getbmscr(exinfo.actscr^);
if (id < 0) or (bm.objmax <= id) then
exinfo.HspFunc_puterror(HSPERR_INVALID_PARAMETER);
if exinfo.HspFunc_getobj(exinfo.actscr^, id, @objinf) <> 0 then
exinfo.HspFunc_puterror(HSPERR_DLL_ERROR);
if objinf.hCld = 0 then
exinfo.HspFunc_puterror(HSPERR_INVALID_PARAMETER);
len := GetWindowTextLength(objinf.hCld);
text := exinfo.HspFunc_malloc(len + 1);
GetWindowText(objinf.hCld, text, len+1);
MessageBox(bm.hwnd, text, 'オブジェクトタイトル', MB_OK);
exinfo.HspFunc_free(text);
end;
else
exinfo.HspFunc_puterror(HSPERR_UNSUPPORTED_FUNCTION);
end;
Result := RUNMODE_RUN;
end;
procedure reg_objtext(info: PHSP3TYPEINFO); stdcall;
begin
hsp3sdk_init(info);
info.cmdfunc := cmdfunc;
end;
exports
reg_objtext;
begin
end.
|
基本的にはHSPシステムが用意している関数を使えばいいのですが間違えると大変なことになる可能性があるので書いておきます。
オブジェクトのHSPOBJINFO構造体を取得するにはHspFunc_getobj関数を使います。
ヘッダファイルやドキュメントから関数の戻り値と引数を調べましょう。以下はドキュメントからの引用です。
int HspFunc_getobj( int wid, int id, void *inf );
function HspFunc_getobj(wid: Integer; id: Integer; inf: Pointer): Integer;
widで指定したウインドゥIDに配置されている、idで指定された番号のオブジェクト情報を取得します。
取得されたデータは、infで指定されたポインタにコピーされます。
HSP3の標準GUIを使用している場合は、infにはHSPOBJINFO構造体の内容がコピーされることになります。
つまりウィンドウ毎(BMSCR構造体)で管理されたHSPOBJINFOテーブルから該当するデータをコピーするわけですが、これをポインタのコピーと間違えないことです。
ポインタのコピーとは引数に指定したポインタ変数に、該当するHSPOBJINFO構造体のアドレスを渡すということです。
ただ渡すだけなら戻り値で渡せばいいので使用例がなくても「お?引数経由ということは書き込み用(指定したポインタの指す領域に書き込む)のかな?」と判断できます。
以下に簡単な(そのままでは使えない)使用例を間違い例と共に示します。
1
2
3
| | var
pobjinf: PHSPOBJINFO;
begin
exinfo.HspFunc_getobj(wid, id, pobjinf);
|
1
2
3
| | var
pobjinf: PHSPOBJINFO;
begin
exinfo.HspFunc_getobj(wid, id, @pobjinf);
|
1
2
3
| | var
objinf: HSPOBJINFO;
begin
exinfo.HspFunc_getobj(wid, id, @objinf);
|