取得したコンピュータ名からNullを削除する

タグの編集
投稿者 なす  (社会人) 投稿日時 2021/10/18 10:39:24
おはようございます。VB.NETの質問です。NameBufferへコンピュータ名を16文字長で取得しました。NameBufferは「****    」と、コンピュータ名****の後16文字目までNullCharが入っています。この文字列のコンピュータ名以降のNullCharを取り除きたいのですが、以下のコードを実行するとPcNameの部分で「Lengthは0またはそれ以上の値が必要です」と例外エラーが発生します。どういう処理が必要でしょうか?


Dim NameBuffer As String
Dim PcName As String

NameBuffer = Environment.MachineName
NameBuffer = LSet(NameBuffer, 16)

PcName = Strings.Left(NameBuffer, InStr(NameBuffer, vbNullChar) - 1)


投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/18 10:56:52
> 16文字目までNullCharが入っています。
いえ、入らないと思いますよ?
提示されたコードで後続に LSet される文字は、ChrW(0) ではなく ChrW(32) ですよね?

そして ChrW(32) を取り除くだけなら、
 PcName = NameBuffer.TrimEnd(" "c)
あるいは
 PcName = NameBuffer.TrimEnd()
あるいは
 PcName = RTrim(NameBuffer)
で十分のはずです。


また、もしも本当に NullChar で 16 桁にパディングしたいのであれば、LSet ではなく
 NameBuffer = Environment.MachineName.PadRight(16, vbNullChar(0))
などとすべきですし、その NullChar を取り除く処理は
 PcName = NameBuffer.TrimEnd(vbNullChar.ToCharArray())
と書けます。
投稿者 るきお  (社会人) 投稿日時 2021/10/18 10:57:05
そのあたりの処理はEnvironmentクラスがうまくやってくれるので、マシン名を取得するにはただ単に次のように記述すつだけです。
Dim PcName As String

PcName = Environment.MachineName


.NET以前はこのような便利なクラスがなかったので、Windows APIを呼び出して、バッファに敷き詰められたNull文字列を自分で除去する必要がありましたね。もう20年くらい前の話です。
https://www.umayadia.com/main/Samples/vbsample010.htm

なお、LSetであまったところに埋められるのはvbNullCharではなく、半角スペースのようです。だから、InStr(NameBuffer, vbNullChar) が 0 を返してプログラムがStrings.Leftでエラーになってしまっているようですね。

なお、今回 LSet を使用されている目的がわかりませんでしたが、16文字に切り詰めるために LSet を使う人はかなり少数派で、SubString が主流です。16文字以下の場合、右側にスペースを埋めるには PadRight を使用します。

参考(今回やりたいこととは違うと思いますが、例として挙げます)
'PcNameが16文字以下の場合、16文字になるように右側にスペースを埋め、16文字以上の場合は、左から16文字までで切り捨てる。 
PcName = PcName.PadRight(16).Substring(0, 16)


投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/18 11:00:34
訂正。
String 型としての NullChar ではなく Char 型としての NullChar を扱うのであれば、
vbNullChar ではなく ControlChars.NullChar を使うべきでした。

NameBuffer = Environment.MachineName.PadRight(16, ControlChars.NullChar)
PcName = NameBuffer.TrimEnd(ControlChars.NullChar)
投稿者 なす  (社会人) 投稿日時 2021/10/18 20:50:49
魔界の仮面弁士様、るきお様

とても参考になりました!ありがとうございました!