vbNullString
vbNullString
という組み込み定数がある。
コードエディタで記述して、Shift + F2 を叩いてみる。
Const vbNullString = ""
VBA.Constants のメンバ
0 の値を持つ文字列を要求する外部プロシージャを呼び出すときに使う定数です。
さらに MSDN をひいてみる
vbNullString 値 0 を持つ文字列
長さ 0 の文字列 ("") とは異なります。外部プロシージャを呼び出す場合に使用します。
えーと、つまり、NULL ポインタだと思ったらいい? LPCTSTR
でいうところの、長さ 0 の文字列は、
LPCTSTR lpszZeroLengthString = "";
なのに対して、
LPCTSTR lpszNullString = NULL;
みたいなもんだと思っていい?、ってずっと理解してた。でもさ、
If vbNullString = "" Then
Debug.Print "vbNullString = """""
Else
Debug.Print "vbNullString != """""
End If
は、
vbNullString = ""
となるんだよね。しかも、String 型の初期値は vbNullString だっていう情報まで。
この疑問のヒントになりそうなのが、The Backyard - BSTR にある。
BSTRには、さらにルールがある。
- 空文字列はNULL
- 実体としてのBSTRはNULLエンドセンチネルを持つ
- 文字列内にL'\0'を保持できる
- BLOBとして利用しても良い(UTF-16とは限らない)
えーと、空文字列はNULL、これは "" と、NULL は区別しないルールになってるって理解でいいの? だれか詳しい人、教えてください。
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/515
コメント
おひさ。ひょんなことから辿り着いてしまったなり(苦笑)。
「vbNullString 値 0 を持つ文字列。長さ 0 の文字列 ("") とは異なります。」は
「vbNullStringはVB言語の空文字列("")表現で、C言語の空文字列("")とは異なります。」と読み替える必要があるね。
なぜ、vbNullString = "" となるか。
Dim strAAAA as String ' 初期化しない
Dim strBBBB as String ' 長さ0の文字列で初期化
strBBBB = ""
Dim strCCCC as String ' vbNullStringで初期化
strCCCC = vbNullString
の場合、strAAAA = strBBBB = strCCCC となる。
つまり、[未初期化] = "" = vbNullString で、実はみんな同じ意味なのね。
では、NULLポインタはというと、VBのHELPにそのヒントが書いてある。
「DLLプロシージャへの文字列の引き渡し」。
要約すると、VBはDLLのLPSTR型のパラメータにBSTR型の変数を渡すときに、その変数が未初期化又は定数vbNullStringだったら、わざわざ NULL(0x00)に変換して渡しているんだそうだ。
もし、DLLにC形式の空文字列("")を渡したい時は、以下のように変数を初期化して渡すべ。
Dim strNullString as String
strNullString = String$(1,vbNullChar)
・・をを!そうだったのか!
関係ないけど、ときどき、なんかのポインタを引数にとるAPIをコールするのに
NULLポインタの変わりに vbNullString を渡しているサンプルがあるが・・・
文字列の終端に'\0'でなくてNULLを代入するのと同じくらい違和感を感じるのは私だけか?