windows 7 - c++ GetUserName()返回用户名和乱码

windows 7 - C++ GetUserName() returning username and gibberish

本文关键字:用户 返回 c++ GetUserName windows      更新时间:2023-10-16

我想获得当前进程的用户名。我使用winapi标准GetUsername函数,如下所示:

TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName((TCHAR*)username, &size);

并像这样打印:

for(int i = 0; i <= UNLEN; i++) if(isalpha(username[i])) cout << (char)(username[i]);

但输出

尼基╕♣■scm +♣■pα┬p♠■≡我■└M♣■╧*■╔■♣y(♣♣(♣♣♣♣T♣@♣3♣■┐

Nicki是我正在测试的系统的用户名。我不知道我做错了什么。它可以很好地编译,并且我包含了

#include <Windows.h>
#include <Lmcons.h>
#include <iostream>
#include <ctype.h>
#include <string>
这些头。

有人能帮帮我吗?

代替

for(int i = 0; i <= UNLEN; i++) if(isalpha(username[i])) cout << (char)(username[i]);

你应该说

for(int i = 0; i <= size; i++) if(isalpha(username[i])) cout << (char)(username[i]);

因为GetUserName计算出实际用户名的长度并将其传递回size(这就是它通过引用传递的原因)。完整的username数组有257个元素长,所以它可以让你将它们全部cout,其中大多数都是无意义的。

来自MSDN站点:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

lpnSize [in, out]在输入时,该变量指定lpBuffer缓冲区的大小(以tchar表示)。在输出时,变量接收复制到缓冲区的tchar的数量,包括结束的空字符

调用之后,缓冲区username包含一个长度为size-1的以0结尾的字符串。任何超过终止0的字节都是任意垃圾。你的代码依赖于这些错误的前提:

  • 用户名只包含字母(isalpha())。数字和下划线是一些可能的附加字符。
  • 字符串被零填充到缓冲区长度。实际上,任何任意的垃圾都可能跟在字符串后面。
  • char是字符。您确定UNICODE和_UNICODE都没有定义吗?

更好地利用

    cout << username;

打印字符串。

提示:只有在需要时才进行类型强制转换,并且要仔细考虑确保它实际上是正确的。

您正在打印UNLEN字符并忽略修改的size参数,因此您得到缓冲区中的乱码