ログオンユーザID取得時の謎の異常終了
VBでのWINDOWSのログオンユーザID取得は、APIを使用しますが、それでも一筋縄では取得できません。
どこが一筋縄でないかというと、普通にGetUserNameでゲットするとString型のエリアを壊してしまうのです(たぶん)。そして、異常終了。
VBの仕様では、String型は2Gバイトまで自動拡張で代入できるはずなのにです。
これは、String型への代入の方式が、VBの世界ではエリアを確保したあと代入するのにたいして、APIの世界では、いきなり代入してしまうのかなと思う次第です。
したがって、あらかじめエリアを確保したあと、代入するとGetUserNameでも上手くログオンユーザIDが取得できます。
しかし、まだ、以下の条件があります。
GetUserNameで取得するログオンユーザIDのサイズはMAXで256。
取得したログオンユーザID文字列の最後の文字の直後にゼロが入っている。
したがってエリア的には、257バイト確保。上記を踏まえてコーディングすると以下のような感じになります。
Declare Function GetUserName Lib "advapi32.dll" _ Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long Const UNLEN = 256 Dim intPos As Integer Dim strUserNameBuffer As String 'ユーザー名を取得 strUserNameBuffer = Space(UNLEN + 1) GetUserName strUserNameBuffer, UNLEN intPos = InStr(strUserNameBuffer, Chr$(0)) If intPos > 0 Then strUserNameBuffer = Left$(strUserNameBuffer, intPos - 1) End If