シグネチャ
{dll-method [access] [calling-convention]
[modifiers]
{name [("dll-name")]
[args]
}:return-type
[{if-missing missing-body}]
}
DLL インターフェイス メソッドを定義します。
access: メソッドにアクセスできるコードを指定します。通常のメソッドがアクセスする値と同じです。public、library、protected、package または private です。既定値は package です。
calling-convention: 外部プロシージャを起動する場合に使用される呼び出し規約です。
cdecl または
stdcall の 1 つでなければなりません。
dll-method を含む
define-dll-class の定義が、既定の呼び出し規約を指定し、そのため呼び出し規約を明示的に指定しない任意の
dll-method が使用されるとします。それが使用されない場合、呼び出し規約を指定するために、すべての
dll-methods が必要になります。
modifiers: 追加修飾子の空白区切りリストです。これらは、通常のメソッドでサポートされているのと同様です。詳細については、
method のドキュメントを参照してください。
name: メソッドの名前です。dll-name も参照してください。
dll-name:
SharedLibrary にある、プロセスの名前です。メソッドはこのプロセスにバインドされます。指定されていない場合は、
name と同じになります。
args:
標準の name:type Curl 引数形式の、入力引数のカンマ区切りリストです。このリストには、一部制限があります。
キーワード引数は許可されています。ただし、これらの引数は外部プロシージャで位置引数に対応しているため、引数リストの適切な位置にある必要があります。
型が Curl 文字列型の 1 つである場合、ユーザは次の構文を使用して、コンバージョン バッファの表現型と最大長を指定できます。
(rep = CString-type [, max-size = size])
StringBuf 引数を渡す場合は、
max-size を設定する必要があります。
return-type: プロシージャが返す型です。
valid-dll-out-type? で受け取られる必要があります。
args と同様に、Curl 文字列型も提供された文字列表現型で受け取られます。
missing-body:
dll-name 名のプロセスが共有ライブラリで見つからない場合、実行するコードを含みます。
dll-method で
{if-missing ...} 宣言が存在せず、DLL クラスが初期化されたときに、ライブラリにこのプロセスが見つからない場合、直ちに
DynamicLookupException がスローされます。
説明
リモートの DLL または共有ライブラリにおいて、プロシージャのプロキシ メソッドを定義します。
dll-method の宣言は
define-dll-class の宣言の内部のみで許可されます。他の場所で宣言の使用を試みると、エラーが発生します。
前述の表記の順序には関係なく、access、calling-convention および modifiers のキーワードをそれぞの順番で配置することができます。
例
C 言語の strlen 関数に対するパブリック インターフェイスを定義します。
{dll-method public cdecl {strlen s:CString}:int}
呼び出し中にメソッドを利用してCurl 文字列を
CString に自動的に変換したい場合は、以下のように記述します。
{dll-method public cdecl {strlen
s:StringInterface (rep = CString)
}:int
}
(rep = CString) の宣言は、define-dll-class に defaults 句があり、CString に設定された string-rep があれば、省略することができます。同様に、cdecl を省略することも可能です。ただし、クラスの既定 calling-convention として設定されている場合です。
{define-dll-class public Strlen
{defaults calling-convention = cdecl, string-rep = CString}
{dll-method public {strlen s:StringInterface}:int}
}