2011-07-26 39 views
1

我有下面的代碼檢索到的火線板的名稱分配給 TCHAR變量。無法讀取俄羅斯字符串_stprintf

TCHAR* firewireName = new TCHAR[wcslen(variantProperty.bstrVal)+1]; 
_stprintf(firewireName, _T("%S"), variantProperty.bstrVal);    
VariantClear(&variantProperty); 

但是當火線的名字是在俄羅斯LSI 1394 OHCI совместимый хост-контроллер 我的firewireName變量只包含LSI 1394 OHCI

我在C++中的n00b,有什麼不對的代碼?

+0

有一兩件事肯定是錯的,你混'TCHAR'用'wcslen',這是一個只有widechar功能的事實。要麼使用相應的'TCHAR'版本,要麼(可能更好?)刪除所有的'TCHAR'引用,並且僅僅讓你的應用程序只有Unicode。 – Jon

回答

3

是。許多。簡而言之。

首先,BSTRs是不是由printf系列函數預期。 BSTR以它們的長度爲前綴,並且printf將期望NULL終止符。這也標誌着您使用wcslen爲錯誤。

其次,你沒有使用任何類型的適當的內存管理。

您需要使用SysStringLen得到的長度,然後將結果存儲在該保證自由本身就是一個C++緩衝區。 ATL提供了一個CComBSTR類應該做的伎倆。