Я работаю с 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, чтобы облегчить жизнь других?
Вы можете конвертировать 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.
Других решений пока нет …