MFCでchar*からwchar_t*へ変換する話。この処理はMultiByteToWideChar関数で行えるが、MFCであれば、CA2Wという便利クラスでラップされているのでこれを使える。
諸事情によりマルチバイト文字セットでプロジェクトを作らなければいけないが、使用するライブラリがconst wchar_t*を要求するという状況に遭遇して調べた。
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と同じ長さの寿命を持てる。
下記のようになる。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 、
などがある。