オブジェクトの情報を取得する †
ここではオブジェクトの情報を管理するHSPOBJINFO構造体の内容を取得してみようと思います。
- スクリプトに
1
2
|
| objtext 1 mes objtext(1)
|
と書くと指定したIDのオブジェクトのウィンドウテキストをメッセージボックスに表示したり、関数としてテキストを返したりする。
- HSPOBJINFO構造体の取得方法を学ぶ。
+
| | step4DllMain2.cpp : 主要となるすべての関数本体が書かれたソースファイル
|
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
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
-
|
!
|
|
|
|
|
!
-
|
|
|
|
|
|
-
|
|
|
|
|
|
-
|
-
|
!
|
|
|
|
!
|
!
-
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
-
|
!
|
|
|
|
|
!
|
|
|
|
|
|
|
|
|
!
-
-
|
|
!
|
!
-
|
|
|
|
!
-
|
!
| #define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "hsp3plugin.h"
static char *myref = NULL;
static char *CopyObjectTitle( int id, BMSCR *bm )
{
int len;
HSPOBJINFO objinf;
if (( id < 0 ) || ( bm->objmax <= id ))
puterror( HSPERR_INVALID_PARAMETER );
if ( getobj( active_window, id, &objinf ) != 0 )
puterror( HSPERR_DLL_ERROR );
if ( objinf.hCld == 0 )
puterror( HSPERR_INVALID_PARAMETER );
len = GetWindowTextLength( objinf.hCld ); if ( myref ) {
myref = (char *)hspexpand( myref, len + 1 ); } else {
myref = (char *)hspmalloc( len + 1 ); }
if ( myref == NULL ) return NULL;
GetWindowText( objinf.hCld, myref, len+1 ); return myref; }
static int cmdfunc( int cmd )
{
BMSCR *bm; int id;
char *text;
code_next();
switch( cmd ) {
case 0x00: id = code_geti();
bm = (BMSCR *)getbmscr( active_window );
text = CopyObjectTitle( id, bm );
if ( text ) {
MessageBox( bm->hwnd, text, "オブジェクトタイトル", MB_OK );
} else {
puterror( HSPERR_OUT_OF_MEMORY );
}
break;
default:
puterror( HSPERR_UNSUPPORTED_FUNCTION );
}
return RUNMODE_RUN;
}
static void *reffunc( int *type_res, int cmd )
{
if ( *type != TYPE_MARK ) puterror( HSPERR_INVALID_FUNCPARAM );
if ( *val != '(' ) puterror( HSPERR_INVALID_FUNCPARAM );
code_next();
BMSCR *bm;
int id;
char *text;
switch( cmd ) {
case 0x00:
id = code_geti();
bm = (BMSCR *)getbmscr( active_window );
text = CopyObjectTitle( id, bm );
if ( text == NULL ) {
puterror( HSPERR_OUT_OF_MEMORY );
}
break;
default:
puterror( HSPERR_UNSUPPORTED_FUNCTION );
}
if ( *type != TYPE_MARK ) puterror( HSPERR_INVALID_FUNCPARAM );
if ( *val != ')' ) puterror( HSPERR_INVALID_FUNCPARAM );
code_next();
*type_res = HSPVAR_FLAG_STR; return (void *)text; }
static int termfunc( int option )
{
if ( myref ) {
hspfree( myref ); myref = NULL;
}
return 0;
}
EXPORT void WINAPI reg_objtext( HSP3TYPEINFO *info )
{
hsp3sdk_init( info );
info->cmdfunc = cmdfunc;
info->reffunc = reffunc;
info->termfunc = termfunc;
}
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved)
{
return TRUE;
}
|
|
+
| | 以前のソース
|
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
|
-
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
|
!
-
|
|
!
-
|
!
| #define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "hsp3plugin.h"
static int cmdfunc( int cmd )
{
HSPOBJINFO objinf; BMSCR *bm; char *text;
int len;
int id;
code_next();
switch( cmd ) {
case 0x00:
id = code_geti();
bm = (BMSCR *)getbmscr( active_window );
if (( id < 0 ) || ( bm->objmax <= id ))
puterror( HSPERR_INVALID_PARAMETER );
if ( getobj( active_window, id, &objinf ) != 0 )
puterror( HSPERR_DLL_ERROR );
if ( objinf.hCld == 0 )
puterror( HSPERR_INVALID_PARAMETER );
len = GetWindowTextLength( objinf.hCld );
text = (char *)hspmalloc( len + 1 );
GetWindowText( objinf.hCld, text, len+1 );
MessageBox( bm->hwnd, text, "オブジェクトタイトル", MB_OK );
hspfree( text );
break;
default:
puterror( HSPERR_UNSUPPORTED_FUNCTION );
}
return RUNMODE_RUN;
}
EXPORT void WINAPI reg_objtext( HSP3TYPEINFO *info )
{
hsp3sdk_init( info );
info->cmdfunc = cmdfunc;
}
BOOL WINAPI DllEntryPoint(HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved)
{
return TRUE;
}
|
|
- 以前まではオブジェクト情報の取得をcmdfunc()内に書いていたが関数としても使えるよう、オブジェクトタイトル取得用の関数CopyObjectTitle?()を用意した。
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
|
-
|
|
|
|
-
|
-
|
!
|
|
!
-
-
|
|
!
|
!
| static char *myref = NULL;
...
static char *CopyObjectTitle( int id, BMSCR *bm )
{
...
len = GetWindowTextLength( objinf.hCld ); if ( myref ) {
myref = (char *)hspexpand( myref, len + 1 ); } else {
myref = (char *)hspmalloc( len + 1 ); }
...
}
static int termfunc( int option )
{
if ( myref ) {
hspfree( myref ); myref = NULL;
}
return 0;
}
|
CopyObjectTitle?()は、引数に与えられた該当するHSPOBJINFO構造体からオブジェクトのハンドルを取得し、オブジェクトのテキストを保存しておくバッファを動的に確保してコピーします。
cmdfunc()、reffunc()はそれぞれがこのテキストを格納したバッファを参照して、メッセージボックスを表示したり、文字列を返す関数として振舞ったりします。
CopyObjectTitle?()は関数終了時にテキスト用に確保したバッファを解放しません。
このためスクリプトの実行が終了されたときにバッファを解放するためにプラグインが破棄される際に呼び出されるtermfunc()を定義し、そこでバッファを解放します。
reffunc()は登録したキーワードが関数として使われるときに呼び出され、呼び出し元に値を返します。
処理の仕方はhspsdk31b7\hspdll.txtの参照受け取りファンクションの手順に従えばいいでしょう。
ここで一番重要なのは、reffunc()の戻り値は返したい値を格納した領域へのポインタという点です。
1
2
3
4
5
6
|
-
|
|
|
!
| static void *reffunc( int *type_res, int cmd )
{
...
*type_res = HSPVAR_FLAG_STR; return (void *)text; }
|
返したい値はint型だったり、double型、str型だったりとさまざまなのでvoidポインタを返します。
voidポインタを受け取った側(HSP)はそれがどの型のポインタなのか知ることができないため、戻り値のタイプを*type_resに設定しておきます。
今回つかった型タイプフラグHSPVAR_FLAG_STRはhspvar_core.hで定義されています。
また、次のようにポインタを返す際、自動変数のポインタを返してはいけません。
1
2
3
4
5
6
7
8
9
|
-
|
|
|
|
|
|
!
| static void *reffunc( int *type_res, int cmd )
{
double d;
...
d = 3.14;
...
*type_res = HSPVAR_FLAG_DOUBLE;
return (void *)&d; }
|
基本的にはHSPシステムが用意している関数を使えばいいのですが間違えると大変なことになる可能性があるので書いておきます。
オブジェクトのHSPOBJINFO構造体を取得するにはEXINFO構造体から提供されるgetobj()関数を使います。
ヘッダファイルやドキュメントから関数の戻り値と引数を調べましょう。以下はドキュメントからの引用です。
int getobj( int wid, int id, void *inf );
widで指定したウインドゥIDに配置されている、idで指定された番号のオブジェクト情報を取得します。
取得されたデータは、infで指定されたポインタにコピーされます。
HSP3の標準GUIを使用している場合は、infにはHSPOBJINFO構造体の内容がコピーされることになります。
つまりウィンドウ毎(BMSCR構造体)で管理されたHSPOBJINFOテーブルから該当するデータをコピーするわけですが、これをポインタのコピーと間違えないことです。
ポインタのコピーとは引数に指定したポインタ変数に、該当するHSPOBJINFO構造体のアドレスを渡すということです。
ただ渡すだけなら戻り値で渡せばいいので使用例がなくても「お?引数経由ということは書き込み用(指定したポインタの指す領域に書き込む)のかな?」と判断できます。
以下に簡単な(そのままでは使えない)使用例を間違い例と共に示します。
1
2
3
|
| HSPOBJINFO *pobjinf;
getobj( wid, id, pobjinf );
|
1
2
3
|
| HSPOBJINFO *pobjinf;
getobj( wid, id, &pobjinf );
|
1
2
3
|
| HSPOBJINFO objinf;
getobj( wid, id, &objinf );
|
- 4回目でプラグイン製作の流れも分かってきた頃かなということで今回は主要なコードだけを載せることにしました。 -- kz3
- 変数値じゃなくてオブジェタイトルですね。 試してみたら勘違いに気づきました。(-_-;) -- hiroki?
- ん、いつのまにhirokiさんコメントを・・・^^;プラグインの方を考えていてチェック忘れてたかな・・・。
それから現状添付のファイルで間違いありました。
範囲外チェックのところで正しくは「 id<0 | bm->objmax<=id 」です。直しておこう^^; -- kz3
- 論理和とORを間違えていましたorz -- kz3
- LongInt?が命令形式で変数を初期化したり、関数形式で型変換を行ったりできるのでどういう作りかなと思いましたが、キーワードを命令にも関数にも登録できるみたいなので記事を書き直します。 -- kz3
- とても参考になりました。ありがとうございましたm(__)m もしよろしければ、code_getvaとcode_setvaのサンプルも載せて頂けませんでしょうか?変数を取得して、それに1足すだけのものでも充分ですのでm(__)mよろしくお願いします。 -- tnr?
- もしよろしければtnrさんがページを作ってみてはいかがでしょうか 関数形式の命令のつくり方も、とってつけたようにこのページにあるよりはテーマを絞ったページにあったほうがいいと思ってるところです。 -- kz3
- 分かりました!サンプル作れるところまでですが、作ってみます。でも期待はしないで下さいf^_^; -- tnr?