我正在尝试创建一个程序,将当前用户名以文本形式(例如 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;
}
答案 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答案。