2011-07-26 28 views
1

検索したFirewireボード名を TCHARという変数に割り当てるコードがあります。_stprintfでロシア語の文字列を読み取ることができません

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

が、ファイヤワイヤの名前は私がfirewireName変数は、私はC++でN00BてるだけLSI 1394 OHCI

含まロシアLSI 1394 OHCI совместимый хост-контроллер であるときに、コード内で何か問題があるのでしょうか?

+0

間違っているのは、TCHARとワイド文字のみの関数である 'wcslen'を混在させるという事実です。対応する 'TCHAR'バージョンを使用するか、(おそらくもっと良い?)すべての' TCHAR'参照を削除し、あなたのアプリケーションをUnicode専用にしてください。 – Jon

答えて

3

はい。たくさん。要するに。

第1に、BSTRは、printfファミリの機能によって期待されるものではありません。 BSTRの先頭には長さがあり、printfにはNULL終端文字が必要です。これはまた、wcslenのあなたの使用が間違っていることを示します。

第2に、適切な種類のメモリ管理を使用できませんでした。

SysStringLenを使用して長さを取得し、結果をC++バッファに格納して、そのバッファを解放することが保証されている必要があります。 ATLは、このトリックを行うべきであるCComBSTRクラスを提供します。

関連する問題