Curlは外部ライブラリにアクセスすることができます。これによりC言語等で作成されたライブラリをコールし、結果を取得することができます。以下にサンプルをもとにして説明していきます。(ちなみにこのサンプルはWindowsのみで動きます。UNIX用のライブラリであれば、UNIX上でも実行することができます。)
当サンプルは、user32.dllに格納されているMessageBox 関数へのインターフェースを使用します。MessageBox は、単にメッセージ ボックスを表示します。インターフェースは以下のようになっています。
int MessageBox(
HWND hWnd;
LPCTSTR lpText;
LPCTSTR lpCaption;
UINT uType;
):int
パラメータには以下のような意味があります。
hWnd
メッセージボックスの上位ウィンドウへのハンドル。NULL の場合、このウィンドウにオーナーはありません。
lpText
表示されるテキスト。
lpCaption
ダイアログ ボックスのタイトルに表示されるテキスト。NULL の場合、既定のタイトルとしてエラーが使用されます。
uType
指定されたフラグに応じて、ダイアログ ボックスの内容と動作を変更します。フラグの種類は多数ありますが、この例で紹介しているのは、その一部です。
ライブラリをコールするクラスは、define-dll-classマクロを使って定義します。以下のようにサンプルでは、このコンストラクタ内で、SharedLibraryクラスを用いて対象DLL(user32.dll)をロードしています。construct-superでスーパークラスのコンストラクタを呼び出していますが、このスーパークラスはDLLInterfaceクラスです。
{define-dll-class public WinMessageBox {defaults calling-convention = stdcall, string-rep = CStringUTF16 } {constructor public {default} {construct-super {SharedLibrary “user32”}} } |
次にdll-methodで対象となる関数を定義することとなります。{defaults …} 句により、クラスに含まれた dll-method に直接、いくつかの既定値を設定できるようになります。これらの既定は、このクラスのサブクラスには適用されません。詳細はCurlのAPIリファレンスdefine-dll-classマクロを参照してください。
対象となる関数の定義については、同様の関数名をdll-methodのメソッド名としてセットするか、任意の名前を振り、括弧()で関数名を記載します。このサンプルでは後者の方法で定義しており、関数名はMessageBoxA、Curl内でのメソッドへのアクセスはshow-ascii-messageとなります。
{dll-method public {show-ascii-message (“MessageBoxA”) …. 省略 …. let box:WinMessageBox = {WinMessageBox} |
実行結果
コードサンプルのダウンロード