Что означает 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
в зависимости от этого определения.