Пример Microsoft C ++ для получения и отображения имени пользователя не компилируется - PullRequest
1 голос
/ 17 апреля 2020

Я хочу получить имя пользователя в C ++ самым простым способом. Моя программа предназначена только для Windows.

. Я хотел бы использовать пример Microsoft . Я скопировал и вставил пример кода в fre sh Visual Studio 2019, но у меня есть ошибки в инструкции TEXT:

значение типа "const wchar_t *" не может использоваться для инициализации объекта типа "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 );
}

Как создать функцию и какие заголовки включить?

std::wstring getUsername() {
   //...
}

Ответы [ 2 ]

4 голосов
/ 17 апреля 2020

Код предполагает C компилятор. Чтобы сделать этот компилятор как C ++, вы должны объявить envVarStrings как TCHAR const* envVarStrings[] и изменить подпись void printError( TCHAR* msg ) на void printError( TCHAR const* msg ). В отличие от C, вы не можете назначить строковый литерал указателю на non-const в C ++.

Если все, что вам нужно, это имя пользователя, вы можете вызвать GetUserName вместо среды чтения переменные. Вызов API возвращает имя пользователя, связанное с вызывающим потоком.

0 голосов
/ 17 апреля 2020

Win32 API предоставьте то, что вам нужно. Функции GetUserNameW и 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;
}
...