文字列を引き渡す

文字列が参照渡しされる場合、LotusScript® は、文字列のコピーへの 4 バイトのポインタをメモリ内で割り当てられた内部バッファに渡します。LotusScript に C 関数が明確に記述されていない限り、C 関数はこのバッファの内容を安全に変更できません。

文字列が値渡しされる場合、LotusScript は、null で終わる文字列 (C 関数で想定されます) に 4 バイトのポインタを渡します。C 関数はこの文字列を変更できますが、その長さを伸ばすことはできません。文字列への変更は、関数からの戻り値としてスクリプトの変数に反映されます。文字列以外へのポインタを渡す場合は、パラメータを参照渡しします。

キーワード LMBCS と Unicode を使用すると、プラットフォーム固有でない文字を引数やリターンコードとして使用するように指定できます。

次の表は、C 関数への文字列引数の処理を示しています。

C 関数 cF の Declare ステートメントの文字列引数の宣言

cF が次のいずれかの形式で呼び出されるときに arg が渡される方法: cF ( ( arg ) ) cF ( ByVal ( arg ) )

cF が次のいずれかの形式で呼び出されるときに arg が渡される方法: cF ( arg ) cF ( ByVal arg )

ByVal String 型

arg 文字のバイト数のコピーへの 4 バイトのポインタとして。cF によってバイト数が変化しても、arg の値は変化しません。cF が文字列の終わりを超えて書き込むと、エラーになります。

arg 文字のバイト数への 4 バイトのポインタとして。cF によってバイト数が変化すると、arg の値が変化します。cF が文字列の終わりを超えて書き込むと、エラーになります。

String

プラットフォームネイティブ文字セット形式の文字列への、4 バイトのポインタとして。cF によってバイト数が変化しても、arg の値は変化しません。

プラットフォームネイティブ文字セット形式による文字列への 4 バイトのポインタとして。cF は、既存の文字列を逆参照して新しい文字列への参照を追加しなければ、バイト数を変更できません。

ここに、Windows の C 関数 GetActiveWindow と SetWindowText を使用してアクティブウィンドウ (フォーカスのあるウィンドウ) のタイトルを設定するサブルーチンがあります。

Sub Initialize
   Dim activeWin As Long, winTitle As String, _
    winLength as Long
   winTitle = String(255,0)
   activeWin = GetActiveWin
   winLength = GetWindowText(activeWin, winTitle, 255)
   winTitle = Left(winTitle, winlength)
   Messagebox winTitle, "Window title"
End Sub

実行時にウィンドウのタイトルを取得するには、GetWindowText 関数を使用します。GetWindowText には、1 つの入力パラメータ (long データ型のウィンドウハンドル) と 2 つの出力パラメータ (String 変数とバッファサイズ (文字列の最大長)) があります。戻り値は、関数が String 型の変数に入れた文字列の実際の長さです。

Declare Function GetWindowText Lib "User32" Alias _
"GetWindowTextA" _
                    (ByVal hWnd As Long, _
                    ByVal lpString As Long _
                    ByVal chMax As Long) As Long
注: C 関数によって値を与えられた String 型の変数を処理する際は注意する必要があります。C 関数によって割り当てられた値の長さが文字列にすでに割り当てられている長さより長いと、文字列に割り当てられていないメモリを上書きします。予期できない結果が発生し、コンピュータがクラッシュする原因になる場合があります。

次の 2 つの方法のいずれかを使用して、String 型の変数が文字列を入れるのに十分な長さを持つことを必ず確認してください。

例えば、文字列の最大長が 255 の場合、String 関数を使用して 255 個の NULL 文字を固定長の String 変数に入れられます。

winTitle$ = String(255, 0)

または、固定長の String 型変数として winTitle を宣言できます。

Dim winTitle As String * 255

GetWindowText は、文字列の実際の長さを返します。可変長の String 型変数を使用する場合、戻り値を使用して文字列の末尾にある余分なものを除去できます。以下に例を示します。

Dim winTitle As String, winLength As Long
winTitle = String(255, 0)
activeWin% = GetActiveWindow()
winTitleLength% = GetWindowText(activeWin%, winTitle$, 255)
winTitle$ = Left(winTitle$, winTitleLength%)
注: 文字列の長さを返さない C 関数を使用する場合は、次のようにして文字列の左の部分を最初の NULL 文字まで取り出すことができます。
stringFromC$ = Left(stringFromC$, Instr(stringFromC$,_
    Chr$(0)) -1)