DLLの構造体付き関数を使うテク

 投稿者:名無しさん  投稿日:2019年 5月21日(火)20時54分24秒
   GURUGURUSMF.DLLというフリーソフトがある。これは文字通りMIDIフアイルをリピイト
再生させることに長けたDLLである。
 C言語系で操作するソフトといっているが、本BASICでも対応可能。
 ただし、DLホルダア内のヘルプとヘッダアファイルの内容をよく読み込むよーに。
 URLはこちら↓
ttp://gurugurusmf.migmig.net
 問題の関数、getplayerstatusとgetsmfinformationは構造体を引数に使っているが、
構造体といっても実は4バイト整数型変数を5つ、9つ並べただけなので、なんと文
字列変数で代用することができる。
 dllフアイルの取扱方法は本BASICヘルプの「外部DLL関数の使用」の項を参照の事。
 なお、C,本BASIC以外の言語(たとえば MSO VBA)ではこの2関数を使うと不具合が生じるので注意(
たとえば専用エディッタアで文字列のコピイを行うと「メモリが足りません」という表示が出るなど)。
 以下、サンプルプログラムを示す。

OPTION CHARACTER byte
LET q=op(-1100,0)          !第1引数は-1100(directmusic)か-1(win mapper)
LET q=al("e:\落ちゲー\data\music\maoudamashii-3-theme01.mid",0,2)    !MIDIは任意のMIDIフアイル名、フアイルIDは第3引数
LET q=pl(0,2,0,0,0)    !フアイルIDは第2引数
DO
   WAIT DELAY 1
   LET w$=REPEAT$(" ",20)
   CALL gs(w$,20)     !第2引数は20(getplayerstatus),36(getsmfinformation)固定
   IF ORD(left$(q$,1))=0THEN     !終了が0,再生中が1,一時停止中が2
      CALL st(0)
      EXIT DO
   END IF
LOOP
CALL cl      !プログラム終了前に必ずClosedeviceしないとフリイズするので注意

END
EXTERNAL FUNCTION op(q,w)
assign"c:\gurugurusmf4-0-6\gurugurusmf4.dll","GGS4OpenDevice"    !関数識別冠詞「GGS4」は必ず必要
END FUNCTION
EXTERNAL FUNCTION al(q$,w,e)
assign"c:\gurugurusmf4-0-6\gurugurusmf4.dll","GGS4AddListFromFileA"
END FUNCTION
EXTERNAL FUNCTION pl(q,w,e,r,t)
assign"c:\gurugurusmf4-0-6\gurugurusmf4.dll","GGS4Play"
END FUNCTION
EXTERNAL SUB cl
assign"c:\gurugurusmf4-0-6\gurugurusmf4.dll","GGS4CloseDevice"
END SUB
EXTERNAL SUB gs(w$,l)
assign"c:\gurugurusmf4-0-6\gurugurusmf4.dll","GGS4GetPlayerStatus"
END SUB
EXTERNAL SUB st(q)
assign"c:\gurugurusmf4-0-6\gurugurusmf4.dll","GGS4Stop"
END SUB

 

戻る