Chapter3. ステートメント


3.4 DLL呼び出し

関数名
EXFUNC
機能
 DLL(ダイナミック リンク ライブラリ)の使用方法を定義します。
書式
EXFUNC [ 戻り値となる変数属性LGP関数名([引き渡し変数[,引き渡し変数・・・]]) , "DLLファイル名" , "DLL内の関数名"
《パラメーター》
戻り値となる変数属性 int/char。関数の戻り値となる値の属性を指定する。
戻り値が必要ない場合は指定しなくてよい。
本指定は変数の属性(数値変数/文字変数)を定義する意味で行うため、プログラム内で本関数を使用する時の変数名を示すものではない。
LGP関数名 char。プログラム内で使用する関数名を指定する。
本指定とDLL内の関数名を一致させる必要はない。
引き渡し変数(引数) int/char。関数に引き渡す値の属性を指定する。
DLLの仕様にあわせて必要な数、適切な順番で指定する。
本指定は変数の属性(数値変数/文字変数)を定義する意味で行うため、プログラム内で本関数を使用する時の変数名を示すものではない。
DLLファイル名 char。DLLのファイル名を指定する。
DLL内の関数名 char。DLL内の関数名を指定する。

 解説 

 DLL(ダイナミック リンク ライブラリ)は、関数の共有ライブラリとして機能する実行ファイルであり、Windows標準やベンダー、個人から多くのDLLが提供されています。LGPではこれらのDLLを使用することでできます。DLLをEXFUNCで定義をすることでLGPで標準実装している関数のように利用することが出来ます。 
 同ステートメントの使用法には以下の条件があります。
1 EXFUNCはプログラムのどこに指定しても利用できます。DLL呼び出しの記述と実際に使用する呼び出すプログラムの出現順が前後してもかまいません。
2 DLLから引き渡すデータ型や個数は、呼び出し元と呼び出されるDLLで一致させること。
3 文字列型の引数にNULLを引き渡す場合には「未使用の文字列変数」または「引数に数値型(int)を定義し0を引き渡す」を行う。
4 以下の引数は使用できない。
・引数の数字がInt(符号付32bit)以外である
・引数が配列や構造体である
・引数でアドレスを送るである
・戻り値が配列や構造体である
5 ・引数にしていた文字列変数に結果を設定するDLLの場合、文字列変数の領域長を十分に確保しておく必要がある。文字列変数に格納できる文字列長は同変数に代入した文字列の内で最大の文字列長となる。通常はこの最大長の変更は自動で行われるがDLL内の代入では変化しない。そこで、事前に必要な領域長に拡張しておく必要がある。DLLで最大100バイト長の文字列を代入する場合には事前に「100バイト長の文字列を一旦代入する」または「LSTR関数を使用する」方法で拡張を行っておくこと。
なお、DLLにを呼び出すまでに未使用の文字列変数はDLLからはNULL扱いとなる。
 DLLとのやり取りに複雑なインタフェースが必要なものは使用できない場合がるので注意して下さい。そのようなDLLは間を取り持つDLLを自作し、その自作DLLを経由させることで使用するという作業が必要になる場合があります。
 自作のDLLを作る場合は以下の点に注意してください。(以下 Microsoft VC++について説明します)
 サンプルのDLLプログラムをダウンロードして見てください。<DownLoad
1 DLL内の関数のインタフェースはWINAPI形式にする。例えば入力が( int , char* )で出力が int の場合は以下のようにする。

int WINAPI test_func( int a , char *b ){
・・・
}
2 「.def」ファイルで関数に番号を付ける
用例
Windows標準のメッセージボックスを表示する。
EXFUNC KEKKA MSGPUT(a,b$,c$,d),"User32.dll","MessageBoxA"

K = MSGPUT(0,"テスト","テストです",0)
LZH圧縮をおこなう。
EXFUNC KEKKA UNLHA( A,B$,C,D ),"UNLHA32.DLL","Unlha"

CMD$="a "+CHR(34)+"OUT.LZH"+CHR(34)+" "+CHR(34)+"in.txt"+CHR(34)
A=UNLHA( 0, CMD$, 0, 0)