白石先生に質問です
- 名無しさん
2025/07/03 (Thu) 17:17:21
十進BASICのヘルプに曰く。
「DLLの関数を呼び出す(独自拡張)
(中略)
文字列型の引数は,1文字目へのポインタ(32ビット)として渡される。ただし,空文字列のときはヌルへのポインタではなく,ヌルを渡す。BASICの文字列はヌルで終端された文字列として利用できる。
引数は,末尾の引数から順にスタック上に積まれる。DLLの関数は,制御を戻す前にスタック上の引数を削除しなければならない。」
この文の文意を教えてください。
私はこの文を、入力した文字列を空文字列にすることだと解釈し、DLL関数を使用するたびにいちいち「""」を入力していました。具体的なコードを挙げます。
ここで使用するDLLはguruguruSMFというフリーソフトでMIDIファイルを演奏したり、曲の題名や演奏長、テンポ等のデエタを取り出したりすることができるDLLなんですが、C言語で使わせるようになっているものを、貴BASICで使用しています。問題の関数 GGS4GetPlayerStatus は構造体を引数にしているのですが、文字列変数w$で代用しています。原コードはグラフィック・アニメとMIDI演奏を混合したバカ長いプログなのでむちゃくちゃ省略してあります。プログラム実行内容よりも問題の GGS4GetPlayerStatus関数に注目してください。Microsoft BASIC文法です。
OPTION BASE 1
DECLARE EXTERNAL FUNCTION op,pl
(中略)
q=op(-1100,0) !MIDIシンセサイザのオープン
e=pl(0,1,0,0,0) !ファイル番"1"の演奏開始
(中略)
let r=1
DO
!関数の使用!
call ゲット発音(ingka)
IF ingka=0THEN !演奏が終了したらリストの次の曲を演奏
let r=r+1
e=pl(0,r,0,0,0)
end if
LOOP
END
external sub ゲット発音(s)
OPTION CHARACTER byte
w$=REPEAT$(" ",20)
CALL gs(w$,20)
s=ORD(w$(1:1))
!問題の箇所!
w$=""
!問題の箇所!
END SUB
EXTERNAL SUB gs(q$,w)
assign"c:\gurugurusmf\gurugurusmf4.dll","GGS4GetPlayerStatus"
END SUB
EXTERNAL FUNCTION op(q,w)
assign"c:\gurugurusmf\gurugurusmf4.dll","GGS4OpenDevice"
END FUNCTION
EXTERNAL FUNCTION pl(q,w,e,r,t)
assign"c:\gurugurusmf\gurugurusmf4.dll","GGS4Play"
END FUNCTION
EXTERNAL SUB st(q)
assign"c:\gurugurusmf\gurugurusmf4.dll","GGS4Stop"
END SUB
汚いインデントで見にくいコードですみません。
どうですか、上例の!問題の箇所!の処理で正しいのでしょうか、それともとんでもない的外れなのでしょうか?
1回確保したスタックを削除しなければならない理由も御存知なら教えてください。
Re: 白石先生に質問です
- SHIRAISHI Kazuo
2025/07/03 (Thu) 18:37:53
「DLLの関数は,制御を戻す前にスタック上の引数を削除しなければならない。」の意味は,DLLがそのように作られていなければならないということです。
空文字列の件も,それを前提に作られたDLLでなければ使えないという意味です。
C言語用のDLLの場合,スタックに関する条件が満たされないのが普通ですが,十進BASICの内部構造の関係で使えてしまうこともあります。
その場合,不具合なく動作していれば無視してかまわないと思います。
Re: Re: 白石先生に質問です
- 名無しさん
2025/07/03 (Thu) 22:02:09
DLL側の問題というのは以外でした
ご回答ありがとうございました
無題
- 名無しさん
2025/07/04 (Fri) 05:34:03
×以外
◯意外