Ошибка макроса TEXT() в консольном приложении проекта visual C++ в VS 2017
в Visual Studio 2017 я попробовал простой демонстрационный код из msdn Получение Системной Информации.
Я создал консольное приложение windows, скопировал код, чтобы переопределить сгенерированный.
Я также установил набор символов в Юникод. затем я скомпилировал его и получил это сообщение об ошибке:
Error C2440 'initializing': cannot convert from 'const wchar_t [18]' to 'TCHAR *' SystemInfo2 c:\demo_temp\systeminfo2\systeminfo2\systeminfo2.cpp 11
Я удивлен, увидев так много сообщений об ошибках(17) для этой демо-версии. должно быть, я что-то упустил, И я не могу сказать, почему.
чтобы вам было удобно, я копирую демо-код здесь.
#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 ); }
Что я уже пробовал:
если включить заголовочный файл <winnt.h>, Я все равно получаю такие сообщения об ошибках.
Я уже настроил набор символов на Unicode, и это консольный проект.
Rick York
Я попросил номера строк в списках кодов здесь, как и многие другие сайты, и это еще один пример того, почему.
Какая из них-строка 11?
Southmountain
из окна сообщения об ошибке он показывает:
Строка 11: текст("OS = %OS%"),
Rick York
Разве нет макроса PCTSTR? Он расшифровывается как указатель на строку const T. Это const TCHAR *. Это очень удобно знать и использовать. Определите сами, если это не так.
Southmountain
очень хорошие мысли. Я еще раз проверю это. Спасибо!