0

_bstr_t オブジェクトを char 配列に変換しようとしています。より具体的には、事前に割り当てられた char 配列を持っています。そのサイズはわかっており、そこに _bstr_t をコピーしたいと考えています。

しばらくの間、私のコードは次のようになりました。

  bool ReadCharPtr(_bstr_t const& input, char* output, unsigned int max_len)
  {
    //  THIS CODE IS WRONG !
    const char * temp (input );
    return ::strcpy_s(output, max_len, temp) == 0;
  }

しかし...よくわかりませんし、Windowsのドキュメントでも明確ではありませんoperator char*() const.. 後で割り当てを解除する必要があるヒープに何かが割り当てられていますか?

このステップを回避し、実際に文字内の _bstr_t を事前に割り当てられた配列に変換する方法はありますか? これにより、ヒープに文字を無料で割り当てることを回避できます...

4

1 に答える 1

1

いいえ。これは必須ではありません。ドキュメントには、「演算子は実際の内部バッファーへのポインターを返すため、結果の文字列を変更することはできません」と記載されています。これは、_bstr_t が削除を処理することを意味します。

さらに、 _bstr_t の実装を確認できます。

MSVC 2010 では:

_bstr_t は _com_util::ConvertBSTRToString() を使用して、BSTR から文字ポインターを取得します。_com_util::ConvertBSTRToString() のドキュメントには、呼び出し元がこれを削除する必要があると書かれています。ただし、_bstr_t はこのポインターをキャッシュし、デストラクタで削除します。

于 2012-06-19T14:48:19.800 に答える