ログオンユーザID取得時の謎の異常終了

VB6,VBA,VBS,EXCEL,DOS,BAT,WSH,WORDの小技メモ

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ 燈明日記/ Perlノート/ 漢字起源/ yahoo

はじめに

本ページは、ウインドウズ系全般のティプスメモです。

そう、はじめはVB系のティプスメモだったのですが…いつの間にか、ウインドウズ系全般のティプスメモになってしまいました。

ちなみに、ティプス(Tips)とは、マニュアルに書かれていない技法や裏わざのことですが、本ページでは、私が経験してこれはと思ったノウハウのメモになっています。

尚、以下は本サイトの最新情報(ブログ)です。

それでは、本ページが何かのお役に立てれば幸いです。ごゆっくりご覧ください。

◆ ログオンユーザID取得時の謎の異常終了

WINDOWSのログオンユーザID取得は、APIを使用しますが、それでも一筋縄では取得できません。

どこが一筋縄でないかというと、普通にGetUserNameでゲットするとString型のエリアを壊してしまうのです(たぶん)。そして、異常終了。

VBの仕様では、String型は2Gバイトまで自動拡張で代入できるはずなのにです。

これは、String型への代入の方式が、VBの世界ではエリアを確保したあと代入するのにたいして、APIの世界では、いきなり代入してしまうのかなと思う次第です。

したがって、あらかじめエリアを確保したあと、代入するとGetUserNameでも上手くログオンユーザ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

おわりに

以下のページには、すべてのTIPSがあります。もしよろしければ、どうぞ!

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくVB-TIPS掲示板へご指摘ください。