LPWSTR для переполнения стека

Я хотел бы прочитать тест utf-8 из таблицы строк DLL.
что-то вроде этого

LPWSTR nnW;
LoadStringW(hMod, id, nnW, MAX_PATH);

и после этого я хотел бы преобразовать LPWSTR nnW в std::wstring nnWstring,
Я пытался таким образом:
LPWSTR nnW;
LoadStringW (hMod, id, nnW, MAX_PATH);

const int length = MultiByteToWideChar(CP_UTF8,
0,   // no flags required
(LPCSTR)nnW,
-1,  // automatically determine length
NULL,
0);

std::wstring nnWstring(length, L'\0');

if (!MultiByteToWideChar(CP_UTF8,
0,
(LPCSTR)nnW,
-1,
&nnWstring[0],
length))

MessageBoxW(NULL, (LPCWSTR)nnWstring.c_str(),  L"wstring", MB_OK | MB_ICONERROR);

После этого в MessageBoxW отображается только первая буква.

2

Решение

Нет необходимости в конвертации или копировании.

std::wstring nnWString(MAX_PATH, 0);
nnWString.resize(LoadStringW(hMod, id, &nnWString[0], nnWString.size());

Примечание: ваш оригинальный код вызывает неопределенное поведение, потому что он пишет с использованием неинициализированного указателя. Конечно, не то, что вы хотели.

Вот еще один вариант:

4

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

Я хотел бы прочитать тест utf-8 из таблицы строк DLL. что-то вроде этого

Обычно таблицы строк в Windows имеют формат UTF-16. Вы пытаетесь объединить данные UTF-8 в одно. Данные UTF-8 обрабатываются как «расширенный» ASCII, поэтому каждый байт расширяется до двух байтов с нулевыми байтами между ними.

Вы, вероятно, должны поместить данные UTF-16 непосредственно в таблицу строк.

Если вам необходимо хранить данные UTF-8 в ресурсах, вы можете поместить их в ресурс RCDATA и использовать функции ресурса более низкого уровня для вывода данных. Затем вам придется конвертировать из UTF-8 в UTF-16, чтобы сохранить его в wstring.

1

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