繁体   English   中英

在VB.NET/Visual Studio 2008中使用GetUserName进行访问冲突

[英]Access Violation using GetUserName in VB.NET / Visual Studio 2008

我到处都在寻找可以解决此问题的方法,而其他人列出的代码似乎无效。

背景:我想使用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-它表示预期在'string'之后的表达式结尾,就好像无法识别'* 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 

谁能说出我在做什么错?

你为什么不使用

 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;
    }
}

尽管史蒂夫的答案是正确且最优雅的,但以下内容说明了您做错了什么:

1)定义固定长度的字符串

VBA

 Dim lpBuff As String * 25

VB.NET

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

2)返回变量应为Integer类型

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM