Что означает LPCWSTR и как с ним следует справляться?

Прежде всего, что это такое? Я предполагаю, что это указатель (LPC означает постоянную константу указателя), но что означает "W"? Является ли это конкретным указателем на строку или указатель на определенную строку?  Например, я хочу закрыть окно с именем "TestWindow".

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

Код является незаконным и не работает, поскольку const char [6] не может быть преобразован в CONST WCHAR. Я этого не понимаю. Я хочу получить четкое представление обо всех этих LPCWSTR, LPCSTR, LPSTR. Я пытался найти что-то, но я еще больше смутился. На сайте msdn FindWindowEx объявлен как

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

Таким образом, последним параметром является LPCSTR, а компилятор требует LPCWSTR. Пожалуйста, помогите.

Ответ 1

LPCWSTR означает "длинный указатель на постоянную широкую строчку". W означает Wide и означает, что строка хранится в 2-байтовом символе против обычного char. Общий для любого кода C/С++, который должен иметь дело только с не-ASCII-строками. =

Чтобы получить стандартную строковую строку C, назначаемую LPCWSTR, вам нужно префикс ее с помощью L

LPCWSTR a = L"TestWindow";

Ответ 2

Это длинный указатель на константу, широкую строку (т.е. строку с широкими символами).

Поскольку это широкая строка, вы хотите, чтобы ваша константа выглядела следующим образом: L"TestWindow". Я бы тоже не создал промежуточный a, я просто передал бы L"TestWindow" для параметра:

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

Если вы хотите быть педантично правильным, "LPCTSTR" - это "текстовая" строка - широкая строка в сборке Unicode и узкая строка в сборке ANSI, поэтому вы должны использовать соответствующий макрос:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

Немногие заботятся о создании кода, который может компилироваться как для наборов символов Unicode, так и для ANSI, и если вы не получите его на самом деле правильно, может быть довольно немного дополнительной работы для небольшого выигрыша. В этом конкретном случае не так много дополнительной работы, но если вы манипулируете строками, есть целый набор макросов манипуляции строкой, которые разрешают правильные функции.

Ответ 3

LPCWSTR эквивалентен wchar_t const *. Это указатель на широкую строку символов, которая не будет изменена вызовом функции.

Вы можете назначить LPCWSTR, добавив L в строковый литерал: LPCWSTR *myStr = L"Hello World";

LPC T STR и любые другие типы T, введите строковый тип в зависимости от настроек Unicode для вашего проекта. Если для вашего проекта определен _UNICODE, использование типов T совпадает с широкими символьными формами, в противном случае формы Ansi. Соответствующая функция также будет называться следующим образом: FindWindowEx определяется как FindWindowExA или FindWindowExW в зависимости от этого определения.