2011-04-16 2 views
2

_bstr_tから派生したクラスAがあります。 wchar_t *をとり、bstrをその中にコピーするメソッドが必要です。 wcsncpy_sがbstrsを理解している場合、これを行うのが最も安全な方法ですか?正しい方法*

void CopyTo(wchar_t* buf, size_t destinationsize) const 
{ 
    wcsncpy_s(buf, destinationsize, static_cast<wchar_t const *>(this), _TRUNCATE); 
} 

あなたが_TRUNCATEを使用しない場合は、無効なパラメータハンドラがバッファが文字列全体を格納するのには小さすぎるときに呼び出されます(プラスヌル:

class A: public _bstr_t 
{ 
    ---- 
    ---- 

    void CopyTo(wchar_t* buf, size_t destinationsize) 
    { 
     wcsncpy_s(buf, destinationsize, *this, length()); 
    } 
}; 

答えて

1

私はあなたがこれをしたいと思います):

http://msdn.microsoft.com/en-us/library/ksazx244%28v=vs.80%29.aspx

+0

私は鋳造部品を知って、より興味を持って0に目的地を設定します、無効なパラメーターハンドラーでOKです。なぜキャストする必要がありますか? –

+0

@Sriram:あなたは「これは」単にあなた 'A'オブジェクトではなく、全く別のオブジェクトに格納された' wchar_t'文字列へのポインタへの参照を与える逆参照ためにキャストする必要があります。キャストは '_bstr_t'の' wchar_t * '演算子関数を呼び出し、実際の記憶域オブジェクトに格納されている' wchar_t * 'を返します。また、 '_bstr_t'が' char * 'で初期化された場合、関数は 'wchar_t'変換を実行し、ポインタを返す前に結果を格納します。あなたがやっていることは全く安全ではありません: – Jollymorphic

+0

は、私は実際に*このデフォルトでは、実際の文字列 –

0

あなたのコードだけで結構です。 wcsncpy_sは「理解していません」_bstr_t sです。しかしwchar_t const*を「理解」ない、と_bstr_tは、適切な変換演算子を持っています

class _bstr_t { 
public: 
// ... 
    // Extractors 
    // 
    operator const wchar_t*() const throw(); 
    operator wchar_t*() const throw(); 
    operator const char*() const ; 
    operator char*() const ; 

(例えばprintfCString::Format)ものの任意の可変引数関数でこれを実行しないように警戒します。それでも問題がなければ、MSVCは警告なしで_bstr_tオブジェクト全体を喜んでスタックにプッシュします。 _bstr_tはポインタとして「解釈」されるのに適したレイアウトを持っていないので、それはない動作します。 (はい、最初で唯一のメンバーはポインタである。しかし、それは文字列へのポインタではありません、それは最初のメンバーは、文字列へのポインタですだ構造体へのポインタです。)

同じこと作業を行いますしかし、CStringCStringは、その厄介なトリックを可能にするために特別に設計されたものです。それは私がそれを行うことを勧めると言っているわけではありません。