Почему BSTR и как конвертировать его в QString?

Я работаю с Microsoft Kinect SDK, где функции возвращают BSTR. Мне нужно получить QString или std :: string.

Вот что я попробовал:

BSTR bstr = s->NuiUniqueId();

// QString qs((QChar*)bstr, SysStringLen(bstr));

std::wstring ws(bstr);

ui->lblDetails->setText(QString::fromStdWString(ws));

При таком решении программа вылетает. С закомментированной строкой я получаю «неразрешенный внешний символ SysStringLen».

Является ли SysStringLen подходом, но мне нужно добавить несколько дополнительных библиотек (не будет ли API включать их уже) или есть другое решение?


Дополнительный вопрос: почему Microsoft делает это? Я имею в виду:

#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
typedef BSTR* LPBSTR;

В чем причина таких вещей? И даже если они считают полезным использовать его внутри, разве они не могли бы просто использовать обычный массив символов или строку std: 🙁 ​​w) в API, чтобы облегчить жизнь других?

2

Решение

Вы можете конвертировать BSTR Возражать char *, а затем преобразовать его в QString. Вот:

QString *getQStringFromBstr(BSTR bstrVal){
char *p= const_cast<char *>(_com_util::ConvertBSTRToString(bstrVal));
return new QString(p);
}

COM был разработан, чтобы быть независимым от языка бинарным эквалайзером. Это означает, что я мог бы использовать функцию VB в C ++ и функцию C ++, скажем, в C # (с COM-взаимодействием). По этой причине большинство строк и некоторые функции были изменены на не зависящий от языка струны IIRC.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]