Что обозначает LPCWSTR и как он должен быть обработан с?

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

79
задан lhj7362 9 February 2010 в 16:42
поделиться

3 ответа

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

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

LPCWSTR a = L"TestWindow";
122
ответ дан 24 November 2019 в 10:14
поделиться

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

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

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

10
ответ дан 24 November 2019 в 10:14
поделиться

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

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

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

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

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

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

6
ответ дан 24 November 2019 в 10:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: