概要 †
ActiveBasic(AB) はネイティブコンパイラを搭載するフリーの BASIC 系言語です。
言語仕様は VisualBasic?(VB) に非常によく似ていますので VB のソースをほぼそのまま移植できます。
(もちろん完全互換ではないので一部修正する必要があったりいろいろ大変です)
DLL も作成できるので HSP 用プラグインも恐らく作成できると思われます。
- 大文字/小文字を区別しない言語仕様なのでいくつかの予約語に引っかかる
- Type(構造体宣言) が HSP3TYPEINFO 構造体などの type メンバと重複
- 他
- code_next() などのマクロ置き換えができない (AB 4)
- exinfo->HspFunc_prm_next() のように書けば呼び出せるが、冗長
- その他
他の言語のガイド †
他の言語のページも合わせて読むと理解が深まります。
- AB 4 以降(4 以前は保証しません)
- HSP3.0 以降
- スクリプトに
と書けばプラグインで用意した(固定された)メッセージボックスを表示する hsmsgbox プラグインを作る。
HSP のプラグイン SDK は C 言語に向けて作られているため、他の言語ではそのままでは使用できません。
下の AB 向けに移植したものを使用してください。
- IDE で 「ファイル」->「新規作成」->「プロジェクト」->「DLL」を選択します
- プロジェクト名などは適当につけてください。
+
| | hsmsgbox.abp
|
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
| | #include "hsmsgbox.idx"
#include "hsp3plugin.sbp"
Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long
Select Case fdwReason
Case DLL_PROCESS_ATTACH
_System_StartupProgram()
DllMain = 1
End Select
End Function
Function cmdfunc(cmd As Long) As Long
Dim a As Long
exinfo->HspFunc_prm_next()
Select Case cmd case &H00 MessageBox(NULL, "メッセージボックス", "テスト", MB_OK)
Case Else
exinfo->HspFunc_puterror(HSPERR_UNSUPPORTED_FUNCTION)
End Select
cmdfunc = RUNMODE_RUN
End Function
Sub Export hsp3cmdinit(info As *HSP3TYPEINFO)
hsp3sdk_init( info ) info->cmdfunc = AddressOf(cmdfunc)
/*
info->option = HSPEVENT_ENABLE_GETKEY
info->eventfunc = AddressOf(eventfunc) */
End Sub
|
|
+
| | msgbox.hsp
|
1
2
3
4
|
| #regcmd "hsp3cmdinit", "hsmsgbox.dll"
#cmd msgbox $000
msgbox
|
|
ここでは DllEntryPoint?()、cmdfunc()、hsp3sdk_init()、msgbox()の4つの関数を説明します。
1
2
3
4
5
6
7
8
9
10
11
12
| | /**********************************************************
* HPI プラグイン初期化関数 *
**********************************************************/
Sub Export hsp3hpi_init(info As *HSP3TYPEINFO)
hsp3sdk_init( info ) sbInit()
info->cmdfunc = AddressOf(cmdfunc) info->reffunc = AddressOf(reffunc) info->termfunc = AddressOf(termfunc)
End Sub
|
こんな感じのプロシージャです。(hsmsgbox.abp のは、これの省略形です。)
これは必ず Export して、HSPから呼び出せるようにします。
hsp3sdk_init()は hsp3plugin.sbp 内で次のように定義されています。
1
2
3
4
5
6
7
| | Sub hsp3sdk_init(info As *HSP3TYPEINFO)
ctx = info->hspctx
exinfo = info->hspexinfo
_type = exinfo->nptype
val = exinfo->npval
End Sub
|
変数は、これの直前で定義されているグローバル変数です。グローバル変数は、どのプロシージャからも参照出来ます。
これらの意味は、後々説明していきます。
hsp3hpi_init (初期化関数) に、
| | info->cmdfunc = AddressOf(cmdfunc)
|
というものがありました。
cmdfuncは、HSPで命令として呼び出されたときの動作を登録する関数です。
同様に、reffunc では、関数やシステム変数としての動作を登録します。
AddressOf?は、指定した関数のポインタ (関数ポインタ) を返す演算子です。
は、キーワードと数値を関連づけます。
このキーワードがスクリプト中に現れた時、プラグインにその数値を渡してきます。
プラグインはその数値をもとになにかしらの事をします。
このとき呼び出されるのが、コマンド受け取りファンクション(cmdfunc)です。
今回の場合だと、
としたときに、HSPが cmdfunc を呼び出します。
cmdfunc の引数に msgbox の数値が入っているので、Select Case 文で処理を振り分けてしまいます。