2015-11-13 25 views
0

現在我正在做一個Windows Metro應用程序作業,並且正在開發一個C++組件來獲取輸入方法的候選列表。如何將Bstr轉換爲Platform :: String?

在最後一步輸出結果列表時發生問題。我可以得到候選人列表中的每個成員,但類型是「Bstr」,爲了讓他們進入Metro應用程序,我必須將它們轉換爲「Platform :: String」類型。

如何將Bstr轉換爲Platform :: String?

我真的很感謝您能提供任何幫助。

+0

'BSTR'是一個指向空終止的UTF-16編碼的字符串的指針,在指向的字符前面有一個16位(我認爲是)字符串長度。根據「Platform :: String」的編碼,您可能需要進行一些轉換。使用將通過'std :: codecvt'的C++標準庫。 –

回答

0

根據MSDN([1][2])我們有這樣的定義:

#if !defined(_NATIVE_WCHAR_T_DEFINED) 
typedef unsigned short WCHAR; 
#else 
typedef wchar_t WCHAR; 
#endif 
typedef WCHAR OLECHAR; 
typedef OLECHAR* BSTR; 

所以BSTRwchar_t*型或unsigned short*的,或空值終止的16位字符串。

從我從Platform::String構造函數的文檔,請參見接受一個空結束的16位字符串作爲const char16*

雖然char16保證代表UTF16,wchar不是。

UPDATE:作爲Cheers and hth. - Alf上面的行指出的是不適用於Windows/MSVC如此。在這種情況下,我找不到任何關於兩種類型之間是否安全的信息。由於wchar_tchar16_t都是不同的集成類型,我仍然建議使用std::codecvt來避免問題。

所以,你應該用std::codecvtwchar_t*轉換爲char16_t*,並將結果傳遞給你Platform::String的構造。

+0

「雖然char16保證代表UTF16,但wchar不是。」這是不正確的:這是在Windows中。 –

+0

@ Cheersandhth.-Alf感謝您指出。我更新了我的答案。 –

1

該平臺:: string的構造函數重載使這個非常容易:

BSTR comstr = SysAllocString(L"Hello world"); 
auto wrtstr = ref new Platform::String(comstr); 

是完全完整的,既BSTR和WinRT的字符串可以包含嵌入的0。如果你想處理的那個角落話,那麼:

BSTR comstr = SysAllocStringLen(L"Hello\0world", 11); 
auto wrtstr = ref new Platform::String(comstr, SysStringLen(comstr2)); 
+0

你確定將'wchar_t *'強制轉換爲'char16_t *'是安全的嗎?兩個('wchar_t'和'char16_t')類型都是不同的內部類型,而不僅僅是另一個類型定義。我找不到任何參考資料表明演員陣容會很安全。 –

+0

這些測試代碼片段中沒有強制轉換。很難弄清楚你可能在談論什麼。對於Unix來說char16_t是必需的,它在Windows上是不相關的。只有一種utf-16編碼。 –

+0

也許我在這裏完全錯了,但是如果你看看我的回答以及我發佈的MSDN鏈接,它可能會變得更清楚我的意思。 'BSTR'是'wchar *',而'Platform :: String'等待'char16 *'。根據[MSDN](https://msdn.microsoft.com/en-us/library/mt228149.aspx)和[cppreference.com'](http://en.cppreference.com/w/cpp/language/)類型)這兩種字符類型都表示UTF-16字符,但是是不同的類型。我只想知道這兩種類型之間的轉換是否安全,因爲這兩種類型的內部二進制表示可能是不同的(例如不同的補充)。 –