У меня есть следующий код 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);
}
И по какой-то странной причине моё заявление появляется на японском или китайском. Так потерял на этом.
использование 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 бит каждый).
Вы должны использовать L
префикс с вашими литералами. WINAPI работает в основном с широкими строками.
Что касается того, почему этот префикс работает, вот соответствующая часть в стандарте (§2.14.5 / 11):
Строковый литерал, который начинается с L, такой как L «asdf», является широким строковым литералом. Широкий строковый литерал имеет тип
«Массив из n const wchar_t», где n — размер строки, как определено ниже; имеет статическую продолжительность хранения
и инициализируется с заданными символами.
Мусор, который вы получаете, заключается в том, что вы выполняете приведение, которое ничего не значит, и в итоге получаете данные мусора, которые библиотека пытается интерпретировать как широкую строку.
Действительно, вот что LPCWSTR
:
typedef const wchar_t* LPCWSTR;