2012-11-05 134 views
2

我正在使用Microsoft Kinect SDK,其中函數返回BSTR。我需要得到一個QString或std :: string。爲什麼BSTR以及如何將其轉換爲QString?

這是我已經試過:

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)字符串來讓其他人的生活更輕鬆?

回答

3

您可以將BSTR對象轉換爲char *,然後將其轉換爲QString。這裏:

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

COM被設計成與語言無關的二進制均衡器。這意味着我可以在C++(與COM互操作)中使用C++和C++函數中的VB函數。這就是大部分字符串和功能被改爲語言中立字符串IIRC的原因。

+0

謝謝。我仍然有段錯誤,但轉換工作。我剛纔在微軟的參考文獻中發現,我一直在使用的方法的描述是「不要使用」......仍然懷疑所有的typedefs。 – jaho

+1

COM是一個有趣的有趣的世界:-) –

+0

嗯,仍然是一個segfault與下面的代碼,這次,一個工作函數: BSTR bstr = s-> NuiDeviceConnectionId(); char * p = const_cast (_com_util :: ConvertBSTRToString(bstr)); QString * qs = new QString(p); ui-> lblDetails-> setText(* qs); – jaho