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

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

Другие вопросы по тегам