< ClassView 情報ファイルにアクセスできません。ClassView 情報が使用できません。 | wsprintf と sprintf >

June 17, 2004

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には、さらにルールがある。
  1. 空文字列はNULL
  2. 実体としてのBSTRはNULLエンドセンチネルを持つ
  3. 文字列内にL'\0'を保持できる
  4. 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を代入するのと同じくらい違和感を感じるのは私だけか?

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?