Что означает LPCWSTR и как с ним обращаться? - PullRequest
75 голосов
/ 09 февраля 2010

Прежде всего, что именно? Я предполагаю, что это указатель (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 ]

115 голосов
/ 09 февраля 2010

LPCWSTR означает «длинный указатель на постоянную широкую строку». W обозначает Wide и означает, что строка хранится в 2-байтовом символе по сравнению с нормальным значением char. Общий для любого кода C / C ++, который имеет дело со строками не-ASCII. =

Чтобы получить обычную строковую литералу C для присваивания LPCWSTR, вам необходимо добавить к ней префикс L

LPCWSTR a = L"TestWindow";
10 голосов
/ 09 февраля 2010

LPCWSTR эквивалентно wchar_t const *. Это указатель на строку широких символов, которая не будет изменена при вызове функции.

Вы можете присвоить LPCWSTR s, добавив L к строковому литералу: LPCWSTR *myStr = L"Hello World";

LPC T STR и любые другие типы T , берите тип строки в зависимости от настроек Unicode для вашего проекта. Если для вашего проекта определено _UNICODE, то использование типов T будет таким же, как формы широких символов, в противном случае формы Ansi. Соответствующая функция также будет вызываться следующим образом: FindWindowEx определяется как FindWindowExA или FindWindowExW в зависимости от этого определения.

6 голосов
/ 09 февраля 2010

Это длинный указатель на постоянную, широкую строку (то есть строку широких символов).

Поскольку это широкая строка, вы хотите, чтобы ваша константа выглядела следующим образом: L"TestWindow". Я бы не стал создавать промежуточное значение a, просто передал бы L"TestWindow" для параметра:

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

Если вы хотите быть педантично правильным, «LPCTSTR» - это «текстовая» строка - широкая строка в сборке Unicode и узкая строка в сборке ANSI, поэтому вы должны использовать соответствующий макрос:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

Мало кто интересуется созданием кода, который может компилироваться как для кодировок Unicode, так и для ANSI, хотя, и если вы не получите его для правильной работы, это может быть немного дополнительной работой за небольшую выгоду. В этом конкретном случае не требуется много дополнительной работы, но если вы манипулируете строками, есть целый набор макросов манипуляции со строками, которые разрешают правильные функции.

...