Что означает BSTR, LPCOLESTR и другие?

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

3 ответов


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

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

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


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

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

кроме того, ранние версии Windows SDK не использовали wchar_t для WCHAR, но без знака. Windows SDK на GCC становится интересным, поскольку-im привел к тому, что GCC 32bit имеет 32bit wchar_t-on компиляторы С 32bit wchar_t, WCHAR будет определен как беззнаковый короткий или какой-либо другой тип, который 16bits на этом компиляторе.


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

LPCWSTR - указатель на постоянную строку с нулевым завершением 16-бит символ Юникода.

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