SAK 図書館
VB 入門編7 - NULL 概念、chr(0)、&H0、\0、IsNull
■NULL 概念
・様々な開発言語で NULL(ヌル) と言う言葉が出てくるが、言語によって微妙
に意味合いが違う。
基本的には NULL は、ないことを意味している。
■VB NULL 概念
・文字列の長さが 0 のヌル文字は、"" となる。
dim s as string
s = "" '長さ 0 のヌル文字
・Windows API など、C 言語インターフェースでの NULL 文字は、chr(0) で
現される。(コード 0x00 の文字)
これは、C 言語が文字列の終わりを 0x00 で識別しているためである。
つまり、"abc" は、C 言語では、「a」「b」「c」「\0」と記憶領域にセ
ットされている。C 構文では、NULL == 0 である。
VB の文字列型には、最後の NULL 文字は存在しないので注意する。
dim s as string
s = "abc" & chr(0) 'C 言語風文字列作成
s = "abc" & chr(&H0) 'C 言語風文字列作成 (&H は 16 進数)
s = left(s, instr(s, chr(0)) - 1) 'C 言語文字列を VB 文字列へ変換
・初期化されていない、または、存在していない Null と言う意味も
最近の VB では良く使われる。
string 型や long 型の初期値は "" や 0 である。
C 言語では、初期化されていない変数の初期値は不定である。
特にデータベースのレコード項目などで Null 項目が発生しやすい。
この場合の Null 項目を参照しようなどとすると VB では例外エラーが発生
する。また Null 値を含む if 評価なども構文そのもののがエラーになる。
(数値の Null も、文字列の Null も同じである。)
if IsNull(rs("数量")) then
msgbox "NULL"
else
msgbox rs("数量")
end if
■C 言語 API 等の NULL 文字削除
・VB から、Windows API や C 言語 DLL 関数を呼び出すと、文字列の扱いが
違うので特殊な処理が必要となる。
・C 言語は文字列のポインタを操作するので、前もって、十分な領域の文字列
領域を確保して受け渡さなければならない。
dim para1 as string
para1 = space(256)
... Windows API 等コール(para1) ...
|_ 255 文字 + NULL 文字の領域となる
・C 言語引数では、文字列ポインタとして NULL を渡す場合が良くある。
この場合は、次のようにする。
... Windows API 等コール(vbNullString) ...
|_ C の NULL を渡す
・C 言語関数から返ってくる文字列には、最後に NULL 文字 chr(0) が付いて
いる。VB で通常の string として扱うには、最後の NULL を削除する。
尚、最後と言うのは、文字列の最後であって、変数有効長の最後ではない。
NULL 文字の位置は返ってくる文字数の最後である。
dim para1 as string
para1 = space(256)
... Windows API 等コール(para1) ...
|_ 255 文字 + NULL 文字の領域となる
para1 = left(para1, instr(para1, chr(0)) - 1)
|_ C の NULL 文字位置検索
・実際には、API エラーで文字列が返って来ていない場合もあるので、
正常リターン時のみ NULL 文字削除を行う。
dim para1 as string
para1 = space(256)
... Windows API 等コール(para1) ...
|_ 255 文字 + NULL 文字の領域となる
if エラー then
para1 = ""
else
para1 = left(para1, instr(para1, chr(0)) - 1)
end if
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料