Что означает 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 *. Это указатель на широкую символьную строку, которая не будет изменена вызовом функции.

вы можете назначить LPCWSTRs, добавив 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, и если вы не заставите его работать правильно, это может быть довольно много дополнительной работы для небольшой выгоды. В этом конкретном случае не так много дополнительной работы, но если вы манипулируете строками, есть целый набор макросов обработки строк, которые разрешают правильные функции.