[トップ][一覧][最近の更新]

編集履歴:過去のバージョン

2008/02/10 03:22:50 JST時点でのHSP3のテクニック他の内容

現在のバージョンとの差分を見る

編集履歴ページに戻る

  HSP3 のちょっと知られていないテクニックなどです。~%
  どう使うかは腕の見せ所(?)です。~%
  [[$$toc]]
  - →[[HSP関連文書]]に戻る 
  
  
  ;;* パス区切りにスラッシュ("/")を使用する
  ;;HSP3 の標準命令及び #include/#addition ではファイル名のパス区切りにバックスラッシュ("\\")以外にも UNIX/Linux 同様スラッシュが使えます。~%
  ;;また、バックスラッシュとスラッシュは混在も可能です。~%
  ;;ただし、 #pack/#epack や一部の命令では使用できません(エラー表示はされないようです)。~%
  ;;WinOS の機能ですので外部コマンド(.com)を実行する場合などには使用できないかもしれません。~%
  ;;バックスラッシュのエスケープをよく忘れる人は代替で使用してみてください。~%
  ;;忘れないように覚えればいいだけの話。100%でない限りテクニックとしては使えない。
  
  * 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
  }}}