CallBack関数 (独自拡張)

 CallBack関数は,BASICから呼び出したDLLから呼び出される手続きである。
 CallBack関数は最大10個まで使うことができ,それらは,0から9までの番号で識別する。
CallBack関数の番号には以下の制限がある。
Windows32ビットのとき,Callaback関数はStdCallになる。番号は引数の個数を意味する(引数の個数ごとに最大1個のCallBack関数が指定できる)。
Windows64ビットのとき,番号0~4は,引数が0~4個の手続きに使用できる。番号5~9は引数の個数を意味する。
Linux(x86)のとき,Callaback関数はCDECLになる。番号は引数の個数を意味する(引数の個数ごとに最大1個のCallBack関数が指定できる)。
Linux(x86_64,AMD64)のとき,番号0~6は,引数が0~6個の手続きに使用できる。番号7~9は引数の個数を意味する。
Linux(Arm32)のとき,番号0~4は,引数が0~4個の手続きに使用できる。番号5~9は引数の個数を意味する。
Linux(Arm64)のとき,番号0~8は,引数が0~8個の手続きに使用できる。番号9は9個の引数を持つ手続きに使用する。


CallBack関数の指定

 CallBack関数として利用する手続きのFUNCTION行またはSUB行の末尾に次の形式でCallBack関数の識別番号を指定する。識別番号は0から9までの定数でなければならない。
FUNCTION 関数名(引数並び),CALLBACK 識別番号
SUB 副プログラム名(引数並び),CALLBACK 識別番号
 Windows 32ビット版のとき,上記に続けて“ , CDECL”,または,“, STDCALL” を追記することができる。  CallBack関数を割り当てる手続きは内部でも外部でもよい。
 引数はすべて値引数になる。ヌル終端文字列へのポインタは文字列変数に受けとることができる。
 それ以外の引数はすべて32ビットまたは64ビットの符号付整数として数値変数名に割り当てなければならない。
ヌル終端文字列へのポインタ以外のポインタを文字列変数で受けてはならない。


CallBack関数のアドレスの取得

 CallBack関数のアドレスはCallBackAdr関数で取得する。引数は,CallBack関数の識別番号。
 異なるプログラム単位にある内部手続きを指定しないこと。

使用例

10 OPTION CHARACTER BYTE
20 CALL EnumWindows(CallBackAdr(1),0)
30 SUB EnumWindows(IpEnumFunc, IPalam)
40    ASSIGN "user32.dll","EnumWindows"
50 END SUB
60 END
100 EXTERNAL FUNCTION GetWindowText(hWnd,IpString$,cch)
110 ASSIGN "user32.dll","GetWindowTextA"
120 END FUNCTION
200 EXTERNAL FUNCTION Enum(Handle), CALLBACK 1
210 LET Name$ = REPEAT$(CHR$(0),255)
220 IF GetWindowText(Handle, Name$, LEN(Name$))<>0 THEN
230    PRINT ImportANSI$(NAME$(1:POS(NAME$,CHR$(0))-1))
240 END IF
250 LET Enum = -1
260 END FUNCTION

注意
 CallBack関数を非同期の呼び出しに利用してはならない。
 引数の個数の誤りは翻訳時にも実行時にもチェックされない。