# 外部DLLのリンク／プラグイン(DLL)の使い方

■ひまわりでは、外部のDLL(Dinamic Link Library)を、リンクすることにより、Ｃ言語や、Delphiなどで作った命令を呼び出すことが出来ます。

・ＤＬＬを利用する手順の説明

1. インポートする命令の定義
2. 命令の呼び出し

■ひまわりで呼び出すことが出来るＤＬＬ

> 以下の条件を満たすもの

> ・呼び出すＤＬＬの引数及び返却値が、void（なし）, ポインタ型、WORD(符号なし2バイト整数),DWORD(符号なし4バイト整数),int(符号あり4バイト整数),BOOL(論理型)であるもの

■ver.1.33以前のバージョンで使われていた「DLL宣言」「文字型DLL宣言」の解説は、こちら。（これは、ver.1.33以前の互換性のためだけに残されている命令です。）

■「ＤＬＬを利用」命令

> 書式：

> 『DLLファイル名』の、『C言語の関数宣言』を、『引数宣言』の、『命令の名前』として、DLLを利用

> 引数の説明：

> DLLファイル名 | リンクするDLLのファイル名
> C言語の関数宣言 | リンクする関数を、C言語のように、"int func(int, int)"のように宣言したもの 返却値　関数名（引数型, 引数型, 引数型 ... ） 利用できる型の種類は、 『WORD, DWORD, BOOL, int, char*, void』のいずれか
> 引数宣言 | ひまわりで使う、『?の,?を』のような引数の助詞を指定
> 命令の名前 | ひまわりで使う命令の名前

> 実行の結果：
> 特殊変数「それ」に、実行の結果を返します。

> 例１：

> ためしに、WindowsAPIの、SetCursorPosを、使ってみます。
> これは、指定の座標(x,y)へ、マウスカーソルを、移動させるというものです。

> ’DLLの利用を宣言 『user32』の、『SetCursorPos(int,int)』を、 『?の,?へ』の、『マウス移動』として、DLLを利用 ’宣言した命令を実行 50の、50へ、マウス移動

> 次に、WindowsAPIの、GetKeyStateを使ってみます。
> GetKeyStateのAPIは、指定のキーが押されているかどうかを判別します。

> ’DLLの利用を宣言 『user32.dll』の、『WORD GetKeyState(int)』を、 『?の』の、『キー状態取得』として、DLLを利用 「Aのキーを押してみてください。」と、表示。 表示用ラベルを、ラベルとして、作成。 ＊確認処理 キー番号は、ASC(`A`) キー番号の、キー状態取得。 表示用ラベル=AND(それ,$80) 描画処理反映。 確認処理へ、飛ぶ。

> 例２：

> 次に、もうちょっと高度な構造体を用いたWindowsAPIを使ってみます。
> 但し、ひまわりには、構造体がないので、ある程度WindowsAPIの知識が必要になります。
> 例として、世界標準時刻を取得する、GetSystemTimeを使ってみます。

> "kernel32"の、"GetSystemTime(char*)"を、 『?に』の、『世界標準時刻取得』として、DLLを利用。'(*1) SYSに、16バイトを、確保。'(*2)SYSTEMTIME構造体のサイズを確保 SYSに、世界標準時刻取得。'GetSystemTimeを、呼び出し 'SYSTEMTIME構造体は、全て WORD(2バイト整数型)なので、 SYSTIME=「年 月 週 日 時 分 秒 ミリ秒」 Iを、0から、7まで、繰り返す( INDEX=I*2+1{バイト} SYSの、INDEXを、『WORD』形式で、バイナリ取得。'(*3) 「{SYSTIME#I} = {それ}」と、表示。 )。

> (*1)構造体を無理やり作るために、構造体へのポインタを、『char*』型として関数に渡します。
> (*2)次に、構造体のサイズ分だけ、メモリを確保します。SYSTIME構造体は、WORD=2バイトが、８個なので、8×2＝16バイト確保します。
> (*3)GetSystemTimeを、『世界標準時刻取得』という名前で呼び出したら、最後に、バイナリ構造体から、任意部分のバイトを取得します。

戻る