Что означает 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. Пожалуйста помочь.
3 ответов
LPCWSTR
означает "длинный указатель на постоянную строку". W означает Wide и означает, что строка хранится в 2-байтовом символе против нормального char
. Общий для любого кода C / C++, который имеет дело только со строками, отличными от ASCII.=
чтобы получить нормальную строку литерала C для назначения LPCWSTR
, вы должны префикс его с L
LPCWSTR a = L"TestWindow";
LPCWSTR
эквивалентно wchar_t const *
. Это указатель на широкую символьную строку, которая не будет изменена вызовом функции.
вы можете назначить LPCWSTR
s, добавив L к строковому литералу:LPCWSTR *myStr = L"Hello World";
LPCTSTR и любой другой T types, возьмите строковый тип в зависимости от настроек Unicode для вашего проекта. Если _UNICODE
определено для вашего проекта, ПОЛЬЗА типов T это же как широкие формы характера, в противном случае Формы Ansi. Соответствующая функция также будет называться следующим образом:FindWindowEx
определяется как FindWindowExA
или FindWindowExW
в зависимости от этого определения.
Это длинный указатель на константу, широкую строку (т. е. строку широких символов).
поскольку это широкая строка, вы хотите, чтобы ваша константа выглядела так:L"TestWindow"
. Я бы не стал создавать промежуточное a
либо, я бы просто передать L"TestWindow"
параметр:
ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");
если вы хотите быть педантически правильным, "LPCTSTR" - это строка "текст" -- широкая строка в сборке Unicode и узкая строка в сборке ANSI, поэтому вы должны использовать соответствующий макрос:
ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));
мало кто заботится о создании кода, который может компилироваться как для Юникода, так и для наборов символов ANSI, и если вы не заставите его работать правильно, это может быть довольно много дополнительной работы для небольшой выгоды. В этом конкретном случае не так много дополнительной работы, но если вы манипулируете строками, есть целый набор макросов обработки строк, которые разрешают правильные функции.