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 テクニック編資料