Эти «типы» всегда показывают сюрпризы, например, когда вы делаете, LPCSTR p, q;и вы хотели иметь const char *p, *q;. Можете ли вы отказаться от их использования?
ott--
9
Мерзость
Томас Эдинг
2
64-битное портирование 32-битного приложения требует знания такой терминологии
LPCTSTR= L Ong P ointer к C onst
T CHAR STR Инг (не волнуйтесь, длинный указатель такой же , как указатель. Были две разновидности указателей под 16-битных Windows.)
Вот таблица:
LPSTR знак равно char*
LPCSTR знак равно const char*
LPWSTR знак равно wchar_t*
LPCWSTR знак равно const wchar_t*
LPTSTR= в char* or wchar_t*зависимости от_UNICODE
LPCTSTR= в const char* or const wchar_t*зависимости от_UNICODE
Каждый раз, когда я вижу это имя типа, мне хочется съежиться. В этом есть что-то, что заставляет меня чувствовать себя неловко. (+1 Кстати)
Донал Феллоуз
2
Когда я должен использовать указатель такого типа?
Флориан Маргэйн
@FlorianMargaine Когда API говорит вам. Просто используйте «правильные» типы до тех пор
Джеймс
1
будьте осторожны, здесь есть много предостережений, о которых нужно знать. wchar_t - это 16-битный тип, но его можно использовать для хранения кодированных в кодировке ucs2 и utf-16 символов Юникода. utf-16 может использовать несколько символов wchar_t для кодирования одной буквы, ucs2 поддерживает только подмножество набора символов Unicode. Какие функции API вам нужно вызвать, также зависит от используемой кодировки.
Майкл Шоу
2
Наихудшим является DWORD, который раньше был 32-битным двойным словом, но сейчас это 32-битное полуслово :-)
gnasher729
6
Нет необходимости использовать какие-либо типы, относящиеся к TCHAR.
Эти типы, все типы структур, которые их используют, и все связанные функции отображаются во время компиляции в версию ANSI или UNICODE (в зависимости от конфигурации вашего проекта). В версиях ANSI обычно к концу имени добавляется буква A, а в версиях Unicode добавляется буква W. Вы можете использовать их явно, если хотите. MSDN заметит это при необходимости, например, перечисляет функции MessageBoxIndirectA и MessageBoxIndirectW здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511(v=vs.85).aspx
Если вы не нацелены на Windows 9x, в которой отсутствовали реализации многих функций Юникода, нет необходимости использовать версии ANSI. Если вы ориентируетесь на Windows 9x, вы можете использовать TCHAR для создания бинарных файлов ANSI и Unicode из одной и той же кодовой базы, если ваш код не делает предположений о том, является ли TCHAR символом или wchar.
Если вас не волнует Windows 9x, я рекомендую настроить ваш проект как Unicode и рассматривать TCHAR как идентичный WCHAR. Вы можете явно использовать функции и типы W, если хотите, но если вы не планируете запускать свой проект в Windows 9x, это не имеет значения.
Указатель на постоянную строку с нулевым символом в конце, состоящую из 16-битных символов Юникода. Для получения дополнительной информации см. Наборы символов, используемые шрифтами.
Я знаю, что этот вопрос задавался довольно давно, и я не пытаюсь прямо ответить на точный оригинальный вопрос, но, поскольку этот конкретный вопрос / ответ имеет достойную оценку, я хотел бы добавить сюда немного для будущих читателей. Это связано с тем, Win32APItypedefsкак и как их понимать.
Если кто-то когда-либо занимался программированием для Windows в эпоху 32-битных машин от Windows 95 до Windows 7-8 и выше, они понимают и знают, что они Win32APIзагружены typedefsи что большинство их функций и структур должны быть заполнены и использовать в большой степени полагаться на них.
Вот базовая программа для Windows, которую можно продемонстрировать в качестве демонстрации.
Этого едва хватает для рендеринга приложения Windows. Это самая базовая настройка для инициализации минимальных минимальных свойств для рендеринга основного окна, и, как вы можете видеть, оно уже загружено typedefsиз Win32api.
Давайте разорвать его, глядя на WinMainи InitWindowsAppфункции: Первое , это параметры функций HINSTANCEи PSTR:
WinMainпринимает один HINSTANCEобъект, в то время как InitWindowsAppпринимает два HINSTANCEобъекта: объект PSTR или некоторую другую typedefстроку и int.
Я буду использовать InitWindowsAppфункцию здесь, так как она даст описание объекта в обеих функциях.
Первый HINSTANCEопределяется как H andle для INSTANCE, и именно этот наиболее часто используется для приложения. Второй - это другой HANDLEпредыдущий инстанс, который редко используется больше. Он хранился в унаследованных целях, чтобы не приходилось изменять WinMain()сигнатуру функции, которая может нарушить работу многих уже существующих приложений. Третий параметр является Р ointer к STR Инж.
Итак, мы должны спросить себя, что это HANDLE? Если мы посмотрим на Win32APIдокументы, найденные здесь: Типы данных Windows, мы можем легко найти их и увидеть, что они определены как:
Дескриптор объекта. Этот тип объявлен в WinNT.h следующим образом:
typedef PVOID HANDLE;
Теперь у нас есть другой typedef. Что это PVOID? Ну, это должно быть очевидно, но давайте посмотрим на это в той же таблице ...
Указатель на любой тип. Это объявлено в WinNT.h
typedefvoid*PVOID;
A HANDLEиспользуется для объявления многих объектов в Win32APIтаких вещах, как:
HKEY - Дескриптор ключа реестра. Объявлен в WinDef.h
typdef HANDLE HKEY;
HKL - Дескриптор идентификатора локали. Объявлен в WinDef.h
typdef HANDLE HKL;
HMENU - Ручка к меню. Объявлен в WinDef.h
typdef HANDLE HMENU;
HPEN - Ручка к ручке. Объявлен в WinDef.h
typedef HANDLE HPEN;
HWND - Ручка к окну. Объявлен в WinDef.h
typedef HANDLE HWND;
... и так далее , такие как HBRUSH, HCURSOR, HBITMAP, HDC, HDESKи т.д.
Это все typedefs, которые объявлены с использованием a, typedefкоторый является a, HANDLEа HANDLEсам по себе объявлен как a typedefиз a, PVOIDкоторый также является a typedefдля a void pointer.
Поэтому, когда дело доходит до LPCTSTRнас, мы можем найти это в тех же документах:
Это определяется как LPCWSTRесли UNICODEопределено или LPCSTRиначе.
Многие из типов дескрипторов более строго типизированы, чем просто HANDLEпсевдонимы, если вы активируете STRICTмакрос. Что по умолчанию в новых проектах, я думаю.
Себастьян Редл
@SebastianRedl Это может быть; но я не пытался углубиться в API и строгость строго типизированных аспектов языка. Это был скорее обзор Win32 API и его типов данных с использованием typedefs ...
LPCSTR p, q;
и вы хотели иметьconst char *p, *q;
. Можете ли вы отказаться от их использования?Ответы:
Цитировать Брайана Крамера на форумах MSDN
источник
Нет необходимости использовать какие-либо типы, относящиеся к TCHAR.
Эти типы, все типы структур, которые их используют, и все связанные функции отображаются во время компиляции в версию ANSI или UNICODE (в зависимости от конфигурации вашего проекта). В версиях ANSI обычно к концу имени добавляется буква A, а в версиях Unicode добавляется буква W. Вы можете использовать их явно, если хотите. MSDN заметит это при необходимости, например, перечисляет функции MessageBoxIndirectA и MessageBoxIndirectW здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511(v=vs.85).aspx
Если вы не нацелены на Windows 9x, в которой отсутствовали реализации многих функций Юникода, нет необходимости использовать версии ANSI. Если вы ориентируетесь на Windows 9x, вы можете использовать TCHAR для создания бинарных файлов ANSI и Unicode из одной и той же кодовой базы, если ваш код не делает предположений о том, является ли TCHAR символом или wchar.
Если вас не волнует Windows 9x, я рекомендую настроить ваш проект как Unicode и рассматривать TCHAR как идентичный WCHAR. Вы можете явно использовать функции и типы W, если хотите, но если вы не планируете запускать свой проект в Windows 9x, это не имеет значения.
источник
Эти типы описаны в разделе Типы данных Windows на MSDN:
источник
Я знаю, что этот вопрос задавался довольно давно, и я не пытаюсь прямо ответить на точный оригинальный вопрос, но, поскольку этот конкретный вопрос / ответ имеет достойную оценку, я хотел бы добавить сюда немного для будущих читателей. Это связано с тем,
Win32
API
typedefs
как и как их понимать.Если кто-то когда-либо занимался программированием для Windows в эпоху 32-битных машин от Windows 95 до Windows 7-8 и выше, они понимают и знают, что они
Win32
API
загруженыtypedefs
и что большинство их функций и структур должны быть заполнены и использовать в большой степени полагаться на них.Вот базовая программа для Windows, которую можно продемонстрировать в качестве демонстрации.
Этого едва хватает для рендеринга приложения Windows. Это самая базовая настройка для инициализации минимальных минимальных свойств для рендеринга основного окна, и, как вы можете видеть, оно уже загружено
typedefs
изWin32
api
.Давайте разорвать его, глядя на
WinMain
иInitWindowsApp
функции: Первое , это параметры функцийHINSTANCE
иPSTR
:WinMain
принимает одинHINSTANCE
объект, в то время какInitWindowsApp
принимает дваHINSTANCE
объекта: объект PSTR или некоторую другуюtypedef
строку и int.Я буду использовать
InitWindowsApp
функцию здесь, так как она даст описание объекта в обеих функциях.Первый
HINSTANCE
определяется как H andle для INSTANCE, и именно этот наиболее часто используется для приложения. Второй - это другойHANDLE
предыдущий инстанс, который редко используется больше. Он хранился в унаследованных целях, чтобы не приходилось изменятьWinMain()
сигнатуру функции, которая может нарушить работу многих уже существующих приложений. Третий параметр является Р ointer к STR Инж.Итак, мы должны спросить себя, что это
HANDLE
? Если мы посмотрим наWin32
API
документы, найденные здесь: Типы данных Windows, мы можем легко найти их и увидеть, что они определены как:Теперь у нас есть другой
typedef
. Что этоPVOID
? Ну, это должно быть очевидно, но давайте посмотрим на это в той же таблице ...A
HANDLE
используется для объявления многих объектов вWin32
API
таких вещах, как:HKEY
- Дескриптор ключа реестра. Объявлен в WinDef.htypdef HANDLE HKEY;
HKL
- Дескриптор идентификатора локали. Объявлен в WinDef.htypdef HANDLE HKL;
HMENU
- Ручка к меню. Объявлен в WinDef.htypdef HANDLE HMENU;
HPEN
- Ручка к ручке. Объявлен в WinDef.htypedef HANDLE HPEN;
HWND
- Ручка к окну. Объявлен в WinDef.htypedef HANDLE HWND;
HBRUSH
,HCURSOR
,HBITMAP
,HDC
,HDESK
и т.д.Это все
typedefs
, которые объявлены с использованием a,typedef
который является a,HANDLE
аHANDLE
сам по себе объявлен как atypedef
из a,PVOID
который также является atypedef
для avoid pointer
.Поэтому, когда дело доходит до
LPCTSTR
нас, мы можем найти это в тех же документах:Надеюсь, это поможет вам понять, как использовать
typedefs
особенности типов данных Windows, которые можно найти вWin32
API
.источник
HANDLE
псевдонимы, если вы активируетеSTRICT
макрос. Что по умолчанию в новых проектах, я думаю.