プラグインから任意のラベルにジャンプする †
今回はjumpプラグインを例にラベルジャンプの方法を説明していきます。
BCC 5.5.1
- スクリプトに
1
2
3
4
5
|
| jump *Label_1
stop
*Label_1
mes "Hello, world !"
return
|
と書けばLabel_1にジャンプをして処理を実行し、ジャンプ元に処理を返すプラグインを作ります。
- ラベルジャンプの方法を学ぶ。
+
| | dllmain.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
|
-
|
|
|
-
|
|
|
|
|
!
|
!
-
|
|
!
-
|
!
| #include <windows.h>
#include "hsp3plugin.h"
#include "jump.h"
static int cmdfunc( int cmd )
{
code_next();
switch( cmd ) {
case 0x00:
jump(); break;
default:
puterror( HSPERR_UNSUPPORTED_FUNCTION ); }
return RUNMODE_RUN;
}
EXPORT void WINAPI register_jump( HSP3TYPEINFO *info )
{
hsp3sdk_init( info ); info->cmdfunc = cmdfunc; }
BOOL WINAPI DllEntryPoint(HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved)
{
return TRUE;
}
|
|
+
| | jump.h
|
1
2
3
4
5
6
|
| #ifndef _JUMP_JUMP_H_
#define _JUMP_JUMP_H_
void jump( void );
#endif
|
|
+
| | jump.cpp
|
1
2
3
4
5
6
7
8
9
10
11
12
|
-
|
|
|
|
!
| #include <windows.h>
#include "hsp3plugin.h"
#include "jump.h"
void jump( void )
{
unsigned short *label;
label = code_getlb(); code_call( label ); }
|
|
+
| | jump.as(プラグイン定義ファイル)
|
1
2
|
| #regcmd "register_jump","jump.hpi"
#cmd jump $00
|
|
+
| | jump.hsp(サンプル)
|
1
2
3
4
5
6
7
8
9
|
| #include "jump.as"
mes "Hello, world !"
jump *Label_1
mes "Good-bye !"
stop
*Label_1
mes "Jumpping !"
return
|
|
1
2
|
| label = code_getlb(); code_call( label );
|
スクリプトのラベルの位置はラベルへのポインタによって取得できます。
これを取得するのがcode_getlb()関数です。
この関数で得られたラベルポインタを使って実際に処理をジャンプさせることができます。
gotoによるジャンプはcode_setpc()を、gosubによるジャンプはcode_call()を呼び出します。
いずれもHSPEXINFO構造体の関数ポインタによって提供されています。
hsp3plugin.hでこれらを通常の関数のように扱えるように以下のように置換されるように定義されています。
1
2
3
|
| #define code_setpc exinfo->HspFunc_setpc
#define code_call exinfo->HspFunc_call
#define code_getlb exinfo->HspFunc_prm_getlb
|
hspのreturnには通常のgosubによるパラメータ無しの復帰と、oncmdで見られるパラメータ付きの復帰があります。
hspのヘルプによるとreturnで数値を返すと値によってシステム変数にリターンコードが格納されるようです。
これはプラグインからでも簡単に取得できますがreturnで値を返したのか返さなかったのかは、HSPCTX構造体のretval_levelメンバを調べることで分かります。
retval_levelには値を返すreturnが最後に実行された時のサブルーチンレベルが格納されます。
パラメータ無しのreturnはretval_levelの値を書き換えません。
- あ、分かった。returnコードについて・・・。これで目的のプラグインが作れるかも知れない。step1〜step3はその布石というわけでした・・・。勉強がてらレポートを残しておこうと思ったり、HSP開発wikiの守備範囲拡大を狙ったり・・・。これに続いて書く人が出てくれば尚良し^^; -- kz3
- ウインド表示とかオブジェクトの配置等だけHSPにやらして、本処理はhpiで...というやり方もありますね。 こっちが高速だったりしてね。(^^;) -- hiroki?
- 試験的にこのページだけ#regionを使ってみる。全部やっちゃうとFx使っている人が困るからなぁ^^; -- kz3