CallBack関数 (独自拡張)
CallBack関数は,BASICから呼び出したDLLからWin32 APIの呼び出し手順によって呼び出すことのできる手続きである。
CallBack関数は最大10個まで使うことができ,それらは,0から9までの番号で識別する。
CallBack関数の指定
CallBack関数として利用する手続きのFUNCTION行またはSUB行の末尾に次の形式でCallBack関数の識別番号を指定する。識別番号は0から9までの定数でなければならない。
FUNCTION 関数名(引数並び),CALLBACK 識別番号
SUB 副プログラム名(引数並び),CALLBACK 識別番号
CallBack関数を割り当てる手続きは内部でも外部でもよい。
引数はすべて値引数になる。ヌル終端文字列へのポインタは文字列変数に受けとることができる。
それ以外の引数はすべて32ビット符号付整数として数値変数名に割り当てなければならない。
(ヌル終端文字列へのポインタ以外のポインタを文字列変数で受けてはならない。)
32ビットを超える大きさを持つ引数は,32ビットごとに分割して数値変数で受け取る。
コールバック関数の全引数(埋め草を含む)のバイト数と,引数並びに書いた引数の数の4倍とが一致しなければならない。
真偽値は数値変数で受け取る。非ゼロを真と解釈すればよい。
真偽値を関数の結果(戻り値)として要求されたときは,真のとき1(または-1),偽のとき0を返せばよいのが普通。
CallBack関数のアドレスの取得
CallBack関数のアドレスはCallBackAdr関数で取得する。引数は,CallBack関数の識別番号。
異なるプログラム単位にある内部手続きを指定しないこと。
使用例
100 OPTION CHARACTER BYTE
110 LET Name$ = REPEAT$(CHR$(0),255
120 CALL EnumWindows(CallBackAdr(9), 0)
130 SUB EnumWindows(IpEnumFunc, IPalam)
140 ASSIGN "user32.dll","EnumWindows"
150 END SUB
160 FUNCTION GetWindowText(hWnd,IpString$,cch)
170 ASSIGN "user32.dll","GetWindowTextA"
180 END FUNCTION
190 FUNCTION Enum(Handle), CALLBACK 9
200 IF GetWindowText(Handle, Name$, LEN(Name$))<>0 THEN
210 PRINT NAME$(1:POS(NAME$,CHR$(0))-1)
220 END IF
230 LET Enum = -1
240 END FUNCTION
250 END
注意
CallBack関数を非同期の呼び出しに利用してはならない。
引数の個数の誤りは翻訳時にも実行時にもチェックされない。引数の個数の誤りは,コンピュータシステムに重大な損傷を与える可能性がある。