今日のジャンク.txt

プログラムメモ、きまぐれ日記、etc...

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ATLメモ] atlconv.h 備忘録

マルチバイト文字列をUnicode文字列に変換したり、その逆を行いたい場合、それぞれMultiByteToWideChar()WideCharToMultiByte()が利用できますが、引数の数が多かったり、変換後の文字列バッファサイズを事前に調べて適切なメモリ領域を確保/開放する等が必要だったりで、気軽には扱いにくいと思います。

そこで、自前でヘルパークラスを用意するのもいいのですが、ATLヘッダ atlconv.h をインクルードする事で、非ATL/MFCプロジェクト上でも便利な文字列変換機能が利用できます。

まず、ATL3.0 (VC++6.0) からサポートされている文字列変換マクロ (SourceType2[C]DestinationType) の使用例は以下の通り。
USES_CONVERSION;  // ← ATL文字列変換マクロを使用
char szTextA[] = "サンプル文字列1";
wchar_t szTextW[] = L"サンプル文字列2";

// (A)マルチバイト文字列 → (W)Unicode文字列
wchar_t* pszWorkW = A2W ( szTextA );

// (A)マルチバイト文字列 → (CW)Unicode文字列定数
const wchar_t* pcszWorkW = A2CW( szTextA );

// (W)Unicode文字列 → (A)マルチバイト文字列
char* pszWorkA = W2A( szTextW );

// (W)Unicode文字列 → (CA)マルチバイト文字列定数
const char* pcszWorkA = W2CA( szTextW );
ATL文字列変換マクロを使用するには、まず関数内でUSES_CONVERSIONを宣言する必要があります。
各マクロの命名規則は、'A'=マルチバイト文字列、'W'=Unicode文字列、'C'=定数を表し、'2'('to'の事でしょうね) を間に挟んで、どのタイプの変換を行うか指定できます。

ただし、これらの文字列変換マクロはスタック領域にメモリを割り当てるため、大きな文字列を扱ったり、ループ中で使用するのには向いていません。

このためATL7.0 (VC+.NET 2002) から、先頭にクラスを表す'C'が付加された、文字列変換マクロ・クラス (CSourceType2[C]DestinationType[EX]) が追加されました。
char   szTextA[] =  "サンプル文字列1";
wchar_t szTextW[] = L"サンプル文字列2";

// (A)マルチバイト文字列 → (W)Unicode文字列
// キャスト演算子により、CA2W オブジェクトの外観は wchar_t*

CA2W szWorkW( szTextA );

// (W)Unicode文字列 → (A)マルチバイト文字列
// キャスト演算子により、CW2A オブジェクトの外観は char*

CW2A szWorkA( szTextW );
Cから始まる文字列変換マクロを使用する場合、USES_CONVERSIONの宣言は不要です。

新しい変換クラスでは、変換される文字列が短い場合はスタック領域を使用、一定の長さ(デフォルト:128byte)を越える可能性がある場合はヒープ領域を確保するので、メモリが効率的に利用されます。また、使用したいスタック領域を節約したい場合、末尾に'EX'が付いたテンプレートクラスを用いる事もできます。
(例えば、64byteを越えない事が明らかなの場合、CA2WEX<64>, CW2AEX<64>など)

また、tchar.h をインクルードして汎用文字列を扱っている場合は、A2TT2WCA2TCT2W等、'T'のキャラクタが含まれたマクロも利用できます。
例えばCT2Aは、コンパイル時にプリプロセッサ _UNICODE が指定されていた場合、CW2Aと解釈されますが、プリプロセッサが指定されていないと、CA2Aと解釈され、変換が行われずにそのままの値を返すようになります。

注意すべき事は、新しい文字列変換マクロは一時的にメモリを確保しているだけなので、キャスト演算子から返されたメモリアドレスを保持して、後から参照しようとすると不都合が発生します。
char* pszWorkA = CW2A( szTextW );
printf("%s", pszWorkA); // ← pszWorkAが指すメモリは既に無効!

スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://junktxt.blog90.fc2.com/tb.php/46-049355a1
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。