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网站上的代码有两个问题:

  1. 无法识别 Dim lpBuff As String * 25 - 它说,“字符串”之后预期的表达式结束,就好像“* 25”无法识别一样;和,

  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 调用的属性。
如果我没记错的话,用户名映射到 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 回答