Lotus Software ロゴ
IBM Lotus Domino Designer 8.5
  バージョン 8.5 および 8.5.1






文字列を引き渡す

文字列が参照渡しされる場合、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 型)、および String 型の変数とバッファサイズ (文字列の最大長) の 2 個の出力パラメータがあります。戻り値は、関数が 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)
関連項目
外部 C 関数を呼び出す
引数を C 関数へ引き渡す
配列、型、オブジェクトを引き渡す




ライブラリー | サポート | ご利用条件 |

最終更新日: 2009 年 10 月 5 日 (月曜日)