В чем смысл BSTR, LPCOLESTR и других? - PullRequest
7 голосов
/ 22 октября 2009

В чем смысл BSTR, LPCOLESTR, LPCWSTR, LPTSTR, LPCWCHAR и многих других, если они все просто наборы определений, которые в любом случае разрешают wchar_t?

Ответы [ 3 ]

10 голосов
/ 22 октября 2009
  • LPTSTR указывает, что строковый буфер может быть ANSI или UNICODE в зависимости от определения макроса: UNICODE.
  • LPCOLESTR был изобретен командой OLE, потому что он переключает свое поведение между char и wchar_t, основываясь на определении OLE2ANSI
  • LPCWSTR является wchar_t строкой
  • BSTR - это LPOLESTR, выделенный с помощью SysAllocString.
  • LPCWCHAR - указатель на один постоянный широкий символ.

Они на самом деле все довольно разные. Или, по крайней мере, были в разное время. Ole был разработан - и нужен - широкие строки, в то время как Windows API все еще был Win16 и вообще не поддерживал широкие строки.

Кроме того, более ранние версии Windows SDK не использовали wchar_t для WCHAR, но были беззнаковыми short. Windows SDK на GCC становится интересным, поскольку я уверен, что 32-битный GCC имеет 32-битный wchar_t - на компиляторах с 32-битным wchar_t, WCHAR будет определен как unsigned short или какой-то другой тип, который будет 16 бит на этом компиляторе.

10 голосов
/ 22 октября 2009

LPTSTR и LPWSTR и подобные определения на самом деле просто определяют. BSTR и LPOLESTR имеют особое значение - они указывают, что указанная строка выделена особым образом.

Строка, на которую указывает BSTR, должна быть выделена с помощью функций семейства SysAllocString (). Строка, на которую указывает LPOLESTR, обычно должна быть выделена с помощью CoTaskMemAlloc () (это следует искать в документации, чтобы COM-вызов принимал / возвращал ее).

Если требования выделения / освобождения для строк, на которые указывают BSTR и LPOLESTR, нарушаются, программа может столкнуться с неопределенным поведением.

2 голосов
/ 22 октября 2009

Страница MSDN на Типы данных Windows может дать разъяснения относительно различий между некоторыми из этих типов данных.

LPCWSTR - Указатель на константу 16-битной константы с нулевым символом в конце Юникод символы.

LPTSTR - LPWSTR , если определен UNICODE, LPSTR в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...