COMの bstr_t は自動的にUNICODEに変換するのですか?

[戻る]
テン 2002/05/04(土) 15:40:16
下記のテストコード[龍さんとYuOさんのコードを参考にして]を作りました。
_bstr_tのコンストラクタにchar型変数を入れました。
デバッカーのウォッチで確認するとその時点ですでにUNICODEに変換されていました。
_bstr_tというのは、そのようなものなのでしょうか?
あるいは環境[OSとか#defineしているかなど]によるのでしょうか?
ご存じの方がおられましたら教えてください。
よろしくお願いします。

VC++6.0 SP5 WINXP MFCDialog です。

void CUni1Dlg::OnButton3() 
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
char szTest[255] = {("たちつてと")};
_bstr_t    bstrt(szTest);        //#include <comdef.h> が必要
//すでUNICODEに変換されている?
int nLen = bstrt.length();
LPWSTR lpszW = new WCHAR[nLen];
lpszW = bstrt.copy();
CString cstrUCode;
  for (int i = 0; i<nLen; ++i) {
  CString cstrValue;
  cstrValue.Format( "0000%X", (unsigned long)lpszW[i] );
  cstrUCode += cstrValue.Right(4);
}
MessageBox(cstrUCode);
//UNICODEに変換されているのが確認できる?
delete []lpszW;    //Debugビルドでは実行時エラー
}

YuO [E-Mail] 2002/05/05(日) 21:51:51
_bstr_tというのは,C++のクラスです。
つまり,
> _bstr_t    bstrt(szTest);        //#include <comdef.h> が必要
というのは,
_bstr_t::_bstr_t(const char* s) throw(_com_error);
を呼び出しています。

あと,
> delete []lpszW;    //Debugビルドでは実行時エラー
は,
> lpszW = bstrt.copy();
が原因です。
ここで,lpszWの値(!=*lpszWの値)が書きかわります。
そのため,deleteする時のlpszWの値は,new[]が返した値ではなくなっています。

こーいうのは,std::vector<wchar_t>を使うと良いかと。
#delete[]が不要になり,例外にも強くなる。

テン 2002/05/06(月) 00:11:11
[[解決]]
YuOさん詳しい説明ありがとうございます。

>ここで,lpszWの値(!=*lpszWの値)が書きかわります。
>そのため,deleteする時のlpszWの値は,new[]が返した値ではなくなっています。
ということで
//LPWSTR lpszW = new WCHAR[nLen];
//lpszW = bstrt.copy();
を
  LPWSTR lpszW = bstrt.copy(); //1行にまとめて newしない

最後の行の
//delete []lpszW;    //Debugビルドでは実行時エラー
を削除しました。
ご指摘のとおり、リリース、デバッグいずれもエラーがきえました。

それとUnicodeと
>std::vector<wchar_t>についてはこれから勉強したいと思います。

古いスレッドには追加発言できません。