Ошибка LPCWSTR; Есть ли лучшее решение?

У меня есть следующий код C ++, и кажется, что везде, где я пытаюсь поместить строку, я должен преобразовать ее, чтобы избежать `Cannot преобразовать параметр 2 из ‘const char [x] в LPCWSTR. Я знаю, что могу решить эту проблему, выполнив простое преобразование, но есть ли способ обойтись преобразованием практически каждой строки, которую я предоставляю? Я разработчик C #, изучающий C ++, так что я предполагаю, что мне не хватает какой-то фундаментальной концепции языка, если бы кто-то мог пролить свет на это, я был бы благодарен!

#include <Windows.h>
#include <string>
using namespace std;

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR cmdLine,
int showCmd)
{
MessageBox(0, "First Win32 Program.", "My App", MB_OK);
}

Есть ли лучшее решение, чем просто это:

{
MessageBox(0, (LPCWSTR)"First Win32 Program.", (LPCWSTR)"My App", MB_OK);
}

И по какой-то странной причине моё заявление появляется на японском или китайском. Так потерял на этом.

введите описание изображения здесь

0

Решение

использование L"text" создать свои строки. Таким образом, вы создаете широкую строку, которая, скорее всего, ожидается от WinAPI.

#include <Windows.h>
#include <string>
using namespace std;

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR cmdLine,
int showCmd)
{
MessageBox(0, L"First Win32 Program.", L"My App", MB_OK);
}

Проблема в том, что вы вводите узкую строку, используя приведение в стиле C для LPCWSTR, Таким образом, два из ваших узких символов (по 8 бит) будут смешаны в одном символе UNICODE (16 бит каждый).

2

Другие решения

Вы должны использовать L префикс с вашими литералами. WINAPI работает в основном с широкими строками.

Что касается того, почему этот префикс работает, вот соответствующая часть в стандарте (§2.14.5 / 11):

Строковый литерал, который начинается с L, такой как L «asdf», является широким строковым литералом. Широкий строковый литерал имеет тип
«Массив из n const wchar_t», где n — размер строки, как определено ниже; имеет статическую продолжительность хранения
и инициализируется с заданными символами.

Мусор, который вы получаете, заключается в том, что вы выполняете приведение, которое ничего не значит, и в итоге получаете данные мусора, которые библиотека пытается интерпретировать как широкую строку.

Действительно, вот что LPCWSTR:

typedef const wchar_t* LPCWSTR;
1

По вопросам рекламы [email protected]