为什么选择BSTR以及如何将其转换为QString?

时间:2012-11-05 00:24:56

标签: c++ qt winapi kinect bstr

我正在使用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不会包含它)还是有其他解决方案?


其他问题:为什么微软会这样做?我的意思是:

#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;

这样的事情背后的原因是什么?即使他们发现在内部使用它是有益的,他们也不能在API中使用普通的char数组或std ::(w)字符串来使其他人的生活更轻松吗?

1 个答案:

答案 0 :(得分:3)

您可以将BSTR对象转换为char *,然后将其转换为QString。在这里:

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

COM被设计为语言无关的二进制均衡器。这意味着我可以在C#和C ++函数中使用VB函数,例如C#(使用COM互操作)。这就是大多数字符串和少数函数被更改为语言中性字符串IIRC的原因。