引数を C 関数へ引き渡す

デフォルトでは、LotusScript® は引数を関数またはサブルーチンに参照渡しします。引数が、配列、ユーザー定義のデータ型の変数、またはオブジェクト参照変数である場合、引数を参照渡しする必要があります。それ以外の大部分の場合、ByVal キーワードを使用して変数を値渡しします。

引数の参照渡し

引数が参照渡しされる場合、C 関数は値領域への 4 バイトのポインタを受け取ります。

場合によっては、実際のスタック引数はパブリックに読み取ることのできる構造に変更されます。すべての場合に、データは呼び出される側の関数によって変更されることがあり、変更された値は LotusScript の変数や製品オブジェクトのプロパティに反映されます。このようなプロパティの場合、変更は呼び出しから値が返された直後に発生します。

データ型

C 関数に渡す方法

String

プラットフォーム固有の文字セット形式の文字列への、4 バイトのポインタ

製品固有のオブジェクト

(コレクションを含む)

製品のオブジェクトハンドル (4 バイト)

Array

LotusScript の内部配列形式で格納される配列への 4 バイトのポインタ

タイプ

型のインスタンス内のデータへの 4 バイトのポインタ (文字列を要素として含めることができます)

ユーザー定義オブジェクト

オブジェクト内のデータへの 4 バイトのポインタ (このデータには、文字列、配列、リスト、製品オブジェクトなどを要素として含めることができます)

注: リストは参照渡しできません。また、値渡しもできません。リストを引数として使用すると、ランタイムエラーが発生します。

引数の値渡し

引数が値渡しされる場合、C 関数は引数の実際の値のコピーを受け取ります。

参照渡しされるように C ルーチンで引数を定義しても、C ルーチンはこの値を変更できません。

データ型

キーワード

C 関数に渡す方法

Boolean 型

 

2 バイトの Integer 型のゼロまたは -1 の値が、呼び出しスタックに push されます。

Byte

 

1 バイトの Integer 型の値が呼び出しスタックに push されます。

Integer

 

2 バイトの Integer 型の値が呼び出しスタックに push されます。

Long 型

 

4 バイトの Long 型の値が呼び出しスタックに push されます。

Single

 

4 バイトの Single 型の値が呼び出しスタックに push されます。

Double 型

 

8 バイトの Double 型の値が呼び出しスタックに push されます。

Currency 型

 

LotusScript の内部 Currency 形式にある 8 バイトの値が、呼び出しスタックに push されます。

String

 

文字への 4 バイトのポインタが呼び出しスタックに push されます。C 関数は文字列の終わりを超えてメモリに書き込むことはできません。

呼び出しが変数で行われる場合、C 関数による文字列の変更は変数に反映されます。ByVal として宣言された LotusScript 関数の文字列引数の場合には、これは当てはまりません。

Variant 型

 

16 バイトの構造体が、Variant 型の LotusScript 形式で呼び出しスタックに push されます。

製品固有のオブジェクト

 

4 バイトの製品固有のオブジェクトハンドルが呼び出しスタックに push されます。

Any

 

引数内のバイト数のデータが呼び出しスタックに push されます。例えば引数に Long 型の値が含まれていると、呼び出された関数は 4 バイトを受け取ります。この関数は、実行時には異なるバイト数を受け取ります。

配列、リスト、固定長の文字列、型、クラス、void 型などの他のデータ型は、値で渡すことはできません。これらの型を引数として使用すると、ランタイムエラーになります。

値渡しできるデータ型は、すべて参照渡しできます。

引数 ByVal 0& は、引数が Any 型として宣言される場合は、C 関数への null ポインタを指定します。

Declare Sub SemiCopy Lib "mylib.dll" _
   (valPtr As Long, ByVal iVal As Long)
Dim vTestA As Long, vTestB As Long
vTestA = 1
vTestB = 2

SemiCopy vTestA, vTestB
' The C function named SemiCopy receives a 4-byte pointer to a 
' 2-byte integer containing the value of vTestA, and a 2-byte 
' integer containing the value of vTestB.
' Since vTestA is passed by reference, SemiCopy can dereference 
' the 4-byte pointer and assign any 2-byte integer to that 
' location. When control returns to LotusScript, vTestA 
' contains the modified value. Since vTestB was passed by 
' value, any changes made by the C function are not reflected 
' in vTestB after the function call.