2010/08/12

DLLなどのネイティブコード関数の呼び出し

NILScriptの特徴の一つに、DLLなどのネイティブコード関数を呼び出すラッパー関数を生成する機能があります。
実はNILScriptの機能のほとんどは、この機能でWindowsのAPIやNILScriptに同梱したDLLの関数を呼び出すことで実現しています。
ここでは、ネイティブコード関数呼び出しの基本的な手順を説明します。
なお、ネイティブコード関数関連の機能の説明は「doc\base_native.txt」にありますが、不完全な部分などがありますので、libディレクトリ内のユニットスクリプトでの実際の使用例も参照してください。

まず、最初に「Library.load()」か「WinLibrary.load()」で、ライブラリの読み込みを行います。関数の呼び出し規約がcdeclのライブラリの場合はLibrary、stdcallならWinLibraryを使用します。
load()の引数にはDLL名を指定しますが、システムディレクトリか実行ファイルのあるディレクトリ以外にあるDLLの場合は、フルパスで指定する必要があります。ユニットスクリプトにDLLを同梱する場合は、ユニット初期化関数内での「this.directory.file()」でユニットのディレクトリ内のファイルを取得すればいいでしょう。

次に、ライブラリオブジェクトの「proc」メソッドでラッパー関数を生成します。
下記は、Mouseユニット内で定義されているラッパー関数定義の一例です。

var SetCursorPos=user32.proc("SetCursorPos",[Int,Int],Int);

user32というのはNILScriptにあらかじめ用意されているグローバル変数で、user32.dllのライブラリオブジェクトが格納されています。
proc()の第1引数は、DLL内に定義されている関数の識別名です。大抵は、C言語用ヘッダやドキュメントに書かれている名前と一致するはずですが、WindowsのAPIの中には、末尾に「A」や「W」が付く場合があります。
第2引数は、引数の型を表すオブジェクトの配列です。Int/UInt/Short/UShort/Char/UChar/Double/Floatなどのプリミティブ型の他、バイト配列へのポインタを表すMBStringや、Unicode文字配列へのポインタを表すWideStringなどが用意されています。プリミティブ型の引数には数値を、MBString/WideStringを指定した引数には文字列やnullを指定します。
第3引数には、同様にして返り値の型を指定します。

上記のようにしてラッパー関数を生成しておけば、「SetCursorPos(100,100)」のようにすることで、ラップした関数を呼び出せます。

0 件のコメント:

コメントを投稿