В первую очередь, что это точно? Я предполагаю, что это - указатель (LPC означает длинный постоянный указатель), но что означает "W"? Действительно ли это - определенный указатель на строку или указатель на определенную строку? Например, я хочу закрыть Окно под названием "TestWindow".
HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);
Код недопустим, и он не работает, так как символ константы [6] не может быть преобразован в КОНСТАНТУ WCHAR. Я не получаю его вообще. Я хочу получить ясное понимание всех этих LPCWSTR, LPCSTR, LPSTR. Я пытался найти что-то, однако я запутался еще больше. На сайте MSDN FindWindowEx
объявляется как
HWND FindWindowEx(
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
Таким образом, последний параметр является LPCSTR и требованиями компилятора к LPCWSTRASSE, помогите.
LPCWSTR
означает «длинный указатель на постоянную широкую строку». W обозначает широкий и означает, что строка хранится в виде 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 типы, принимают строковый тип в зависимости от настроек 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"));
Мало кто заботится о создании кода, который может компилироваться как для символов Unicode, так и для символов ANSI наборы, тем не менее, и если вы не добьетесь того, чтобы он действительно работал правильно, может потребоваться довольно много дополнительной работы с небольшой прибылью. В этом конкретном случае дополнительной работы не так уж и много, но если вы манипулируете строками, есть целый набор макросов манипулирования строками, которые разрешают правильные функции.