下記のテストコード[龍さんと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ビルドでは実行時エラー
}
_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[]が不要になり,例外にも強くなる。
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>についてはこれから勉強したいと思います。