将当前用户名写入windows中的文件

时间:2016-09-13 09:55:17

标签: c++ windows username

我正在尝试创建一个程序,将当前用户名以文本形式(例如 John )写入Windows上的文件。我通过GetUserNameEx(NameDisplay, name, &size);尝试了它,但输出值是

  

002CF514

我试过了:

#ifndef _UNICODE
#define _UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#define SECURITY_WIN32
#include <Security.h>

#include <iostream>
#include <Lmcons.h>
#include <fstream>

#pragma comment(lib, "Secur32.lib")

using namespace std;

int main(void)
{
    TCHAR name[UNLEN + 1];
    DWORD size = UNLEN + 1;

    GetUserNameEx(NameDisplay, name, &size);

    ofstream File;
    File.open("NAME.TXT", ios::app);
    File << name;
    File.close();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

由于NameDisplay是一个宽字符串,因此您必须使用wofstream而不是ofstream。另请注意,TCHAR不是awfully deprecated thing。请改用wchar_t。所以正确的版本应该是:

#ifndef _UNICODE
#define _UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#define SECURITY_WIN32
#include <Security.h>

#include <iostream>
#include <Lmcons.h>
#include <fstream>

#pragma comment(lib, "Secur32.lib")

using namespace std;

int main(void)
{
    wchar_t name[UNLEN + 1];
    DWORD size = UNLEN + 1;

    GetUserNameEx(NameDisplay, name, &size);

    std::locale::global(std::locale("Russian_Russia"));
    wofstream File;
    File.open("NAME.TXT", ios::app);
    File << name;
    File.close();

    return 0;
}

更新:显然,Visual Studio始终使用ANSI编码来编写流,因此您必须将语言环境灌输到fstream。更新版本的代码正确地在西里尔语言环境中打印我的用户名。您必须更改国家/地区/语言的区域设置名称。有关其他信息,请参阅this答案。