【问题标题】:Why BSTR and how to convert it to QString?为什么选择 BSTR 以及如何将其转换为 QString?
【发布时间】:2012-11-05 00:24:55
【问题描述】:

我正在使用函数返回 BSTR 的 Microsoft Kinect SDK。我需要得到一个 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 来让其他人的生活更轻松吗?

【问题讨论】:

    标签: c++ qt winapi kinect bstr


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我仍然遇到段错误,但转换有效。我刚刚在微软的参考资料中发现,我一直使用的方法的描述是“不要使用”......仍然想知道所有的typedef。
    • COM 是一个有趣的世界:-)
    • 嗯,仍然是以下代码的段错误,这一次是一个工作函数: BSTR bstr = s->NuiDeviceConnectionId(); char* p = const_cast>(_com_util::ConvertBSTRToString(bstr)); QString qs = new QString(p); ui->lblDetails->setText(*qs);
    • 应该是 QString* qs = new QString(p);
    • 是的。它只是在 cmets(以及 )中不可见,但它就在那里。
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2015-09-27
    • 2018-01-11
    相关资源
    最近更新 更多