2

関数が 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 にはまだ含まれていません)、または別の解決策はありますか?


追加の質問: 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;

このようなものの背後にある理由は何ですか? また、内部的に使用することが有益であるとわかったとしても、API で通常の char 配列または std::(w)string を使用して、他の人の生活を楽にすることはできませんか?

4

1 に答える 1

3

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に変更された理由です。

于 2012-11-05T00:35:10.800 に答える