BSTR в Windows изначально содержали UCS-2, но в принципе могут содержать весь набор Unicode, используя суррогатные пары . Поддержка UTF-16 на самом деле зависит от API, который получает строку - BSTR не знает, как с ней обращаться. Большинство API поддерживают UTF-16 к настоящему времени. ( Майкл Каплан разбирается в деталях.)
Заголовки окон по-прежнему содержат другое определение BSTR, в основном это
#if defined(_WIN32) && !defined(OLE2ANSI)
typedef wchar_t OLECHAR;
#else
typedef char OLECHAR;
#endif
typedef OLECHAR * BSTR;
Нет никакой реальной причины рассматривать char
, если только вы отчаянно не хотите быть совместимым с тем, для чего это было. (IIRC был активен - или мог быть активирован - для ранних сборок MFC и, возможно, даже использовался в Office для Mac или что-то в этом роде.)