スポンサーリンク

MFCでCA2Wを使ってchar*文字列をwchar_t*文字列に変換する

MFCでchar*からwchar_t*へ変換する話。この処理はMultiByteToWideChar関数で行えるが、MFCであれば、CA2Wという便利クラスでラップされているのでこれを使える。

諸事情によりマルチバイト文字セットでプロジェクトを作らなければいけないが、使用するライブラリがconst wchar_t*を要求するという状況に遭遇して調べた。

CA2W

void CChildView::OnPaint() 
{
  CPaintDC dc(this);

  const char *szText = "テキスト";
  wchar_t* wideText = ATL::CA2W(szText);

  ::TextOutW(dc.GetSafeHdc(), 0, 0, wideText,wcslen(wideText));

}

このCA2Wというクラスが何をやっているかというと、

1.CA2Wはコンストラクタにchar*が渡される
2.内部でwchar_t*のバッファを128byte確保
3.MultiByteToWideCharを呼び出してバッファへ格納(バッファサイズはテンプレート引数で指定可能)
4.出来上がった結果はoperator LPWSTR()によって暗黙キャストされて返却

普通、式内で作られたCA2Wオブジェクトは式が終わると同時に解放されるが、C++は一時オブジェクトが参照されている場合、現在のスコープの終わりまでライフタイムが延長されるという機能があり、これによってCA2WはwideTextと同じ長さの寿命を持てる。

MultiByteToWideCharを直接使う場合

下記のようになる。delete[]し忘れが怖い。CA2Wを使ったほうがいい。

void CChildView::OnPaint() 
{
  CPaintDC dc(this);

  const char *szText = "サンプルテキスト";

  wchar_t* wideText = new wchar_t[128];

MultiByteToWideChar( CP_ACP, // コードページ。ANSI 0, // フラグ。0でいい szText, // 変換したい文字列 -1, // 文字列の長さ。-1でnull終端で自動計算 wideText,// 変換後の文字列を格納するバッファ 128 // 変換後の文字列を格納するバッファのサイズ ); ::TextOutW(dc.GetSafeHdc(), 0, 0, wideText,wcslen(wideText)); delete [] wideText; // 解放を忘れずに }

その他

char* →wchar_t* の CA2W の他に、
TCHAR → wchar_t*の CT2W
wchar_t* → charの CW2A

などがある。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: