获取和显示用户名的 C++ Microsoft 示例无法编译
C++ Microsoft example to get and display the user name doesn't compile
我想以最简单的方式获取C++中的用户名。我的程序专为 Windows.
而设计
我想用Microsoft example。我在新的 Visual Studio 2019 中复制粘贴代码示例,但我在 TEXT
指令上有错误:
a value of type "const wchar_t *" cannot be used to initialize an entity of type "TCHAR *"
TCHAR* envVarStrings[] =
{
TEXT("OS = %OS%"),
TEXT("PATH = %PATH%"),
TEXT("HOMEPATH = %HOMEPATH%"),
TEXT("TEMP = %TEMP%")
};
...
printError(TEXT("GetUserName"));
...
这是完整的代码:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
TCHAR* envVarStrings[] =
{
TEXT("OS = %OS%"),
TEXT("PATH = %PATH%"),
TEXT("HOMEPATH = %HOMEPATH%"),
TEXT("TEMP = %TEMP%")
};
#define ENV_VAR_STRING_COUNT (sizeof(envVarStrings)/sizeof(TCHAR*))
#define INFO_BUFFER_SIZE 32767
void printError( TCHAR* msg );
void main( )
{
DWORD i;
TCHAR infoBuf[INFO_BUFFER_SIZE];
DWORD bufCharCount = INFO_BUFFER_SIZE;
// Get and display the name of the computer.
bufCharCount = INFO_BUFFER_SIZE;
if( !GetComputerName( infoBuf, &bufCharCount ) )
printError( TEXT("GetComputerName") );
_tprintf( TEXT("\nComputer name: %s"), infoBuf );
// Get and display the user name.
bufCharCount = INFO_BUFFER_SIZE;
if( !GetUserName( infoBuf, &bufCharCount ) )
printError( TEXT("GetUserName") );
_tprintf( TEXT("\nUser name: %s"), infoBuf );
// Get and display the system directory.
if( !GetSystemDirectory( infoBuf, INFO_BUFFER_SIZE ) )
printError( TEXT("GetSystemDirectory") );
_tprintf( TEXT("\nSystem Directory: %s"), infoBuf );
// Get and display the Windows directory.
if( !GetWindowsDirectory( infoBuf, INFO_BUFFER_SIZE ) )
printError( TEXT("GetWindowsDirectory") );
_tprintf( TEXT("\nWindows Directory: %s"), infoBuf );
// Expand and display a few environment variables.
_tprintf( TEXT("\n\nSmall selection of Environment Variables:") );
for( i = 0; i < ENV_VAR_STRING_COUNT; ++i )
{
bufCharCount = ExpandEnvironmentStrings(envVarStrings[i], infoBuf,
INFO_BUFFER_SIZE );
if( bufCharCount > INFO_BUFFER_SIZE )
_tprintf( TEXT("\n\t(Buffer too small to expand: \"%s\")"),
envVarStrings[i] );
else if( !bufCharCount )
printError( TEXT("ExpandEnvironmentStrings") );
else
_tprintf( TEXT("\n %s"), infoBuf );
}
_tprintf( TEXT("\n\n"));
}
void printError( TCHAR* msg )
{
DWORD eNum;
TCHAR sysMsg[256];
TCHAR* p;
eNum = GetLastError( );
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, eNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
sysMsg, 256, NULL );
// Trim the end of the line and terminate it with a null
p = sysMsg;
while( ( *p > 31 ) || ( *p == 9 ) )
++p;
do { *p-- = 0; } while( ( p >= sysMsg ) &&
( ( *p == '.' ) || ( *p < 33 ) ) );
// Display the message
_tprintf( TEXT("\n\t%s failed with error %d (%s)"), msg, eNum, sysMsg );
}
如何创建函数,我应该包含哪些 headers?
std::wstring getUsername() {
//...
}
代码假定使用 C 编译器。要将此编译为 C++,您必须将 envVarStrings
声明为 TCHAR const* envVarStrings[]
,并将 void printError( TCHAR* msg )
的签名更改为 void printError( TCHAR const* msg )
。与 C 不同,您不能在 C++ 中将字符串文字分配给指向非常量的指针。
如果您只需要用户名,您可以调用 GetUserName 而不是读取环境变量。 API调用returns与调用线程关联的用户名。
Win32 API provide what you need. The function GetUserNameW and GetComputerNameW正是你所需要的,而且使用非常简单。这是一个有效的例子:
#include <iostream>
#include <string>
#include <windows.h>
#include <Lmcons.h>
std::wstring getUsername() {
wchar_t username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
GetUserNameW(username, &username_len);
return username;
}
std::wstring getComputerName() {
wchar_t computerName[UNLEN + 1];
DWORD computerName_len = UNLEN + 1;
GetComputerNameW(computerName, &computerName_len);
return computerName;
}
int main()
{
std::wcout << L"Username is : " << getUsername() << std::endl;
std::wcout << L"Computer name is : " << getComputerName() << std::endl;
return 0;
}
我想以最简单的方式获取C++中的用户名。我的程序专为 Windows.
而设计我想用Microsoft example。我在新的 Visual Studio 2019 中复制粘贴代码示例,但我在 TEXT
指令上有错误:
a value of type "const wchar_t *" cannot be used to initialize an entity of type "TCHAR *"
TCHAR* envVarStrings[] =
{
TEXT("OS = %OS%"),
TEXT("PATH = %PATH%"),
TEXT("HOMEPATH = %HOMEPATH%"),
TEXT("TEMP = %TEMP%")
};
...
printError(TEXT("GetUserName"));
...
这是完整的代码:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
TCHAR* envVarStrings[] =
{
TEXT("OS = %OS%"),
TEXT("PATH = %PATH%"),
TEXT("HOMEPATH = %HOMEPATH%"),
TEXT("TEMP = %TEMP%")
};
#define ENV_VAR_STRING_COUNT (sizeof(envVarStrings)/sizeof(TCHAR*))
#define INFO_BUFFER_SIZE 32767
void printError( TCHAR* msg );
void main( )
{
DWORD i;
TCHAR infoBuf[INFO_BUFFER_SIZE];
DWORD bufCharCount = INFO_BUFFER_SIZE;
// Get and display the name of the computer.
bufCharCount = INFO_BUFFER_SIZE;
if( !GetComputerName( infoBuf, &bufCharCount ) )
printError( TEXT("GetComputerName") );
_tprintf( TEXT("\nComputer name: %s"), infoBuf );
// Get and display the user name.
bufCharCount = INFO_BUFFER_SIZE;
if( !GetUserName( infoBuf, &bufCharCount ) )
printError( TEXT("GetUserName") );
_tprintf( TEXT("\nUser name: %s"), infoBuf );
// Get and display the system directory.
if( !GetSystemDirectory( infoBuf, INFO_BUFFER_SIZE ) )
printError( TEXT("GetSystemDirectory") );
_tprintf( TEXT("\nSystem Directory: %s"), infoBuf );
// Get and display the Windows directory.
if( !GetWindowsDirectory( infoBuf, INFO_BUFFER_SIZE ) )
printError( TEXT("GetWindowsDirectory") );
_tprintf( TEXT("\nWindows Directory: %s"), infoBuf );
// Expand and display a few environment variables.
_tprintf( TEXT("\n\nSmall selection of Environment Variables:") );
for( i = 0; i < ENV_VAR_STRING_COUNT; ++i )
{
bufCharCount = ExpandEnvironmentStrings(envVarStrings[i], infoBuf,
INFO_BUFFER_SIZE );
if( bufCharCount > INFO_BUFFER_SIZE )
_tprintf( TEXT("\n\t(Buffer too small to expand: \"%s\")"),
envVarStrings[i] );
else if( !bufCharCount )
printError( TEXT("ExpandEnvironmentStrings") );
else
_tprintf( TEXT("\n %s"), infoBuf );
}
_tprintf( TEXT("\n\n"));
}
void printError( TCHAR* msg )
{
DWORD eNum;
TCHAR sysMsg[256];
TCHAR* p;
eNum = GetLastError( );
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, eNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
sysMsg, 256, NULL );
// Trim the end of the line and terminate it with a null
p = sysMsg;
while( ( *p > 31 ) || ( *p == 9 ) )
++p;
do { *p-- = 0; } while( ( p >= sysMsg ) &&
( ( *p == '.' ) || ( *p < 33 ) ) );
// Display the message
_tprintf( TEXT("\n\t%s failed with error %d (%s)"), msg, eNum, sysMsg );
}
如何创建函数,我应该包含哪些 headers?
std::wstring getUsername() {
//...
}
代码假定使用 C 编译器。要将此编译为 C++,您必须将 envVarStrings
声明为 TCHAR const* envVarStrings[]
,并将 void printError( TCHAR* msg )
的签名更改为 void printError( TCHAR const* msg )
。与 C 不同,您不能在 C++ 中将字符串文字分配给指向非常量的指针。
如果您只需要用户名,您可以调用 GetUserName 而不是读取环境变量。 API调用returns与调用线程关联的用户名。
Win32 API provide what you need. The function GetUserNameW and GetComputerNameW正是你所需要的,而且使用非常简单。这是一个有效的例子:
#include <iostream>
#include <string>
#include <windows.h>
#include <Lmcons.h>
std::wstring getUsername() {
wchar_t username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
GetUserNameW(username, &username_len);
return username;
}
std::wstring getComputerName() {
wchar_t computerName[UNLEN + 1];
DWORD computerName_len = UNLEN + 1;
GetComputerNameW(computerName, &computerName_len);
return computerName;
}
int main()
{
std::wcout << L"Username is : " << getUsername() << std::endl;
std::wcout << L"Computer name is : " << getComputerName() << std::endl;
return 0;
}