[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSP3のテクニック他

HSP3 のちょっと知られていないテクニックなどです。
どう使うかは腕の見せ所(?)です。

oncmd 割込みには事前処理と事後処理とがあるらしい( 非公式 )

事前処理とはHSPがメッセージを処理する前に指定したラベルへ割込みが発生する処理のことで、 oncmd gosub にあたる。
事後処理とはHSPがメッセージを処理した後に指定したラベルへ割込みが発生する処理のことで、 oncmd goto にあたる。

#define MODE 0 ; 0=事後/1=事前

#if MODE
        oncmd gosub *OnCommand, $0111 ; 本来の処理に先駆けて『事前』に割込みを発生する
#else
        oncmd goto  *OnCommand, $0111 ; 本来の処理を行った『後』に割込みを発生する
#endif

        chkbox "hello",n

*watch
        wait 1: title "現在値 = "+n: goto *watch
        stop

*OnCommand
        mes "割込み発生時 = "+n

#if MODE
        return
#else
        goto *watch
#endif

DLL 関数のアドレス取得

実は varptr 関数で変数と同様に DLL 関数のアドレス(ポインタ)を取得できます。
ヘルプにも書かれているのですが意外と知られていないようです。
なお、標準命令/関数、ユーザー定義命令/関数などではできません。

#uselib "user32.dll"
#func MessageBox "MessageBoxA" int, sptr, sptr, int

        func = varptr(MessageBox)   ; 関数のアドレス取得
        mes strf("%08x", func)      ; アドレス表示(16進数)
        buf = "テスト"
        prm = hwnd, varptr(buf), varptr(buf), 0
        mes callfunc(prm, func, 4)  ; 関数実行
        stop