COMの bstr_t は自動的にUNICODEに変換するのですか? – プログラミング – Home

COMの bstr_t は自動的にUN...
 
通知
すべてクリア

[解決済] COMの bstr_t は自動的にUNICODEに変換するのですか?


テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
Topic starter  

下記のテストコード[龍さんと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
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

_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[]が不要になり,例外にも強くなる。


返信引用
テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
Topic starter  

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>についてはこれから勉強したいと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました