Declare
DLL (ダイナミックリンクライブラリー)で定義されている外部ファンクションを呼び出します。
書式
Declare ファンクション名, "DLLファイルパス", " DLL内ファンクション名" [, (引数リスト)] As関数型
パラメーター
- ファンクション名
- プログラムから呼び出すときのファンクション名を指定します。
- DLLファイルパス
- ライブラリーファイルのパスと名前を、コーテーションマーク ("")で囲んだ文字列か、#defineで定義するマクロで指定します。
パスが指定されない場合はRC+ はカレントプロジェクトディレクトリーの中のファイルを検索します。見つからない場合は、ファイルはWindows system32ディレクトリーにあると仮定します。拡張子は省略できますが、省略した場合は、.DLLであると仮定されます。 - DLL内ファンクション名
- オプションパラメーターです。DLLの中の実際のファンクション名か、ファンクションインデックスを指定します。名前は大文字と小文字を区別します。ファンクション名はコーテーションマーク ("")で囲んだ文字列で指定します。インデックスを使用する場合はインデックスの前に、#をつけます。省略した場 "ファンクション名"パラメーターで指定されたファンクション名をDLL内ファンクション名として使用します。
- 引数リスト
- DLL引数のリストです。引数は下記の書式を使用してください。省略可能です。
[ {ByRef | ByVal} ] 変数名[( )] As変数の型
- ByRef
- 呼び出すファンクションの変数を参照する場合は、ByRefを指定します。この場合、ファンクション内での引数の変更を呼び出し側の変数に反映させることができます。参照で渡された値は変更することができます。ByValを指定して変数を参照する場合、ファンクション宣言内でも変数をByRef指定する必要があります。
- ByVal
- デフォルト設定です。値 (ByVal)によってパラメーターは渡されます。値だけが渡されるので、ファンクションが戻るとき、その変数を変えることはできません。呼び出しているファンクションで、変数の値の変更をしないとき、指定します。省略可能です。
- 変数名
- 必須パラメーターです。引数を意味する変数名で、変数の名前をつけるときの規則にしたがい名前をつけます。配列変数を引数として使用する時には、ByRefを必ず指定してください。
- 変数の型
- 必須パラメーターです。引数の型を宣言します。
- 関数型
- 必須パラメーターです。関数型を宣言してください。
解説
現在のプログラムからDLLファンクションを呼び出すときに使います。Declareは、ファンクションの外で使用してください。
Declareステートメントは、コンパイル時にDLLファイルとファンクションが存在していることを確認します。
エラー2473「Epson RC+との連携機能に失敗しました(ビジーまたは未初期化)」が発生する場合の対応は、以下の通りです。
- Epson RC+がコントローラーに接続されていることを確認してください。DLLファンクションはPC上で実行されます。
- WindowsStatus関数を使用して、DLL呼び出しが利用可能であることを確認してください。
数値変数をByValで渡す
SPEL: Declare MyDLLFunc, "mystuff.dll", "MyDLLFunc", (a As Long) As Long
VC++ long _stdcall MyDllFunc(long a);
文字列変数をByValで渡す
SPEL: Declare MyDLLFunc, "mystuff.dll", "MyDLLFunc", (a$ As String) As Long
VC++ long _stdcall MyDllFunc(char *a);
数値変数をByRefで渡す
SPEL: Declare MyDLLFunc, "mystuff.dll", "MyDLLFunc", (ByRef a As Long) As Long
VC++ long _stdcall MyDllFunc(long *a);
文字列変数をByRefで渡す
SPEL: Declare MyDLLFunc, "mystuff.dll", "MyDLLFunc", (ByRef a$ As String) As Long
VC++ long _stdcall MyDllFunc(char *a);
ByRef で文字列を渡すと、DLLの中で文字列を変更することができます。文字列は最長255文字まで使えます。最大文字数を超えないように注意してください。SPEL+は文字列変数のために、内部で固定の255文字領域を確保します。
数値配列をByRefで渡す
SPEL: Declare MyDLLFunc, "mystuff.dll", "MyDLLFunc", (ByRef a() As Long) As Long
VC++ long _stdcall MyDllFunc(long *a);
DLLファンクションからの戻り値
DLLファンクションは、文字列(String型)以外のあらゆるデータ型で戻り値を返すことができます。
文字列を返す必要がある場合は、上記の「文字列変数をByRefで渡す」を参考に、引数として文字列変数を指定して下さい。
戻り値に文字列変数を指定すると、エラー3614: 「Declareコマンドで、戻り値に文字列を指定することはできません。」が発生します。
変数の型
Epson RC+ 8.0のデータ型とC/C++の変数型は、下表のように対応しています。
Epson RC+ 8.0に対応するデータがないため、C/C++のbyte型や構造体は使用することができません。
Epson RC+ 8.0とC/C++ データ型対応表
| Epson RC+ 8.0 | C/C++ |
|---|---|
| Boolean | short |
| Byte | short |
| Short | short |
| Integer | short |
| Long | int |
| Real | float |
| Double | double |
| String | char [256] * Nullを含む |
プログラム例
Declare ReturnLong, "mystuff.dll", "ReturnLong", As Long
Function main
Print "ReturnLong = ", ReturnLong
Fend
Declare使用例
' Declare命令で外部ファンクションを定義します。
' DLLファイルパスにフルパスを設定しない場合、カレントプロジェクトフォルダー、
' Windows System32フォルダーにDLLファイルを置くことができます。
Declare MyDLLTest, "mystuff.dll", "MyDLLTest" As Long
Function main
Print MyDLLTest
Fend
' Declare命令で2つのInteger型引数を持つ外部ファンクションを定義します。
#define MYSTUFF "mystuff.dll"
Declare MyDLLCall, MYSTUFF, "MyTestFunc", (var1 As Integer, var2 As Integer) As Integer
' Declare命令で外部ファンクションをフルパス指定し、
' ファンクションをインデックスで指定して定義します。
Declare MyDLLTest, "c:\mydlls\mystuff.dll", "#1" As Long
← Date$関数 DegToRad関数 →