MessageBoxW
API принимает Unicode (UTF-16) строк, представленный с помощью wchar_t
указателей (неясный LPCWSTR
макроса препроцессора расширяется до const wchar_t*
, т.е. NUL
-завершённых в стиле С Unicode UTF-16 строкой).
Unicode (UTF-16) строковые литералы представлены с использованием L"..."
синтаксиса (обратите внимание на L префикса).
Итак, хотя "Test_text"
является строковым литералом ANSI, L"Test_text"
является строковым литералом в формате Unicode (UTF-16).
Поскольку ваш ARE (неявно, через настройки Visual Studio по умолчанию) делает сборку Unicode, вы должны украсить строковые литералы с L префиксом, например:
MessageBox(nullptr, // <--- prefer nullptr to NULL in modern C++ code
L"Test_text", // <--- Unicode (UTF-16) string literal
L"Message Test", // <--- Unicode (UTF-16) string literal
MB_ICONINFORMATION | MB_OKCANCEL);
альтернатива украсить строку литералов с использованием _T("...")
or TEXT("...")
macros. Они будут расширены до простых "..."
строковых литералов ANSI в сборках ANSI/MBCS и в строковых литералах Unicode (UTF-16) L"..."
в Unicode-сборках (которые по умолчанию используются в современных версиях Visual Studio).
// TEXT("...") works in both ANSI/MBCS and Unicode builds
MessageBox(nullptr,
TEXT("Test_text"),
TEXT("Message Test"),
MB_ICONINFORMATION | MB_OKCANCEL);
Лично я считаю, эта модель TCHAR устаревшую модель из прошлого (я не вижу никаких оснований для получения ANSI строит современных приложений C++ Win32), и принимая во внимание, что современные интерфейсы API для Windows являются Unicode-только (например, DrawThemeText()
) , Я бы просто украсил струнные литералы, используя префикс L"..."
, и вроде забудем о сборках ANSI.
Не показывать ошибки или код через изображения (встроенные или внешние ссылки). Всегда указывайте полный текст ошибки здесь как текст. – crashmstr
И если бы вы искали текст сообщения, вы бы нашли решение уже. – MSalters