0

これに対する解決策をできる限り検索しましたが、他の人がリストしたコードは機能していないようです。

背景: VB を使用してユーザーのユーザー名を取得したい (Visual Studio 2008 を使用)。以前に Excel VBA でこれを行ったことがありますが、以前に使用したコードは機能しません。

ここの MS サイトにリストされているコードを試しました: http://support.microsoft.com/kb/152970

ここにあるわずかに異なるコード: http://www.developerfusion.com/code/4409/get-current-username-in-vbnet/

MS サイトのコードには 2 つの問題があります。

  1. Dim lpBuff As String * 25 が認識されない - '* 25' が認識されないかのように、'string' の後に式の終わりが必要です。と、

  2. 「* 25」を削除すると、行に「アクセス違反」が表示されます: ret = GetUserName(lpBuff, 25)

    Declare Function GetUserName Lib "advapi32.dll" Alias _
    "GetUserNameA" (ByVal lpBuffer As String, _
    ByRef nSize As Integer) As Integer
    
    Public Function ReturnUserName() As String
    
    ' Dimension variables
    Dim lpBuff As String * 25
    Dim ret As Long, UserName As String
    
    ret = GetUserName(lpBuff, 25)
    ReturnUserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
    End Function
    

誰かが私が間違っていることを提案できますか?

4

2 に答える 2

4

使わない理由

 Environment.UserName 

Environmentクラスには、ベースの WinApi 呼び出しに直接マップされる多数のプロパティが含まれています。
私が間違っていなければ、この逆コンパイルされたコードからわかるように、 Usernameは GetUserName にマップされます

public static string UserName
{
    [SecuritySafeCritical]
    get
    {
        new EnvironmentPermission(EnvironmentPermissionAccess.Read, "UserName").Demand();
        StringBuilder lpBuffer = new StringBuilder(0x100);
        int capacity = lpBuffer.Capacity;
        if (Win32Native.GetUserName(lpBuffer, ref capacity))
        {
            return lpBuffer.ToString();
        }
        return string.Empty;
    }
}
于 2013-05-15T19:14:48.990 に答える
3

スティーブの答えは正しく、最も洗練されていますが、以下はあなたが間違ったことを示しています。

1) 固定長文字列の定義

VBA

 Dim lpBuff As String * 25

VB.NET

Dim lpBuff As String 
lpBuff = New String(CChar(" "), 25) 

2) 戻り変数は整数型である必要があります

VB.NET 関数

Public Function ReturnUserName() As String 
   Dim iReturn As Integer 
   Dim userName As String 
   userName = New String(CChar(" "), 50) 
   iReturn = GetUserName(userName, 50) 
   Return userName.Substring(0, userName.IndexOf(Chr(0))) 
End Function
于 2013-05-15T19:37:19.003 に答える