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

标签 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)string 来让其他人的生活更轻松吗?

最佳答案

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

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

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

关于c++ - 为什么选择 BSTR 以及如何将其转换为 QString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13224445/

相关文章:

delphi - EnumerateTraceGuids 返回 "The parameter is incorrect"(87)

c++ - 获取 Windows 上的 RAM 字节总数

c++ - 引用 std::whatever 或 not_yet_in_std::whatever 的惯用方式是什么?

c++ - 为什么在 GCC 4.4.1 中我不能在函数模板中声明默认参数?

c++ - matlab 到 C++/openCV 归一化函数

c++ - 如何调整qt布局中的项目大小?

c++ - 没有循环的整数直方图

qt - QML : Rounded rectangle with border

qt - QML - GridLayout - 无法使用它使页面居中

c++ - 差异 : Environment Variables & Registry Keys