Что означает 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
расшифровывается как "Long Pointer to Constant Wide String". 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";
LPCT STR и любые другие 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, хотя, и если вы не добиваетесь его правильной работы, это может быть довольно сложной работой за небольшую выгоду. В этом конкретном случае не требуется много дополнительной работы, но если вы манипулируете строками, есть целый набор макросов манипуляции со строками, которые разрешают правильные функции.