Что означает 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 иначе.