Windowsプログラミング(3)

今回は文字列について。
2バイト文字を含むパスを扱えるようにするには、マルチバイト文字セットかUnicodeを使わないといけない。
世の中はUnicodeに移行すべき流れのようだけど、Win9xではUnicodeは使えない。
別にchar*決めうちでもいいんだけど、後で移植するのも面倒なので、
とりあえずコードを統一してコンパイル時に切り替えられるようにする。
そのために使うのがTCHAR型。Unicodeを定義すればwchar_tというワイド文字になってくれる。
文字列を扱う関数群もそれに対応したのを使う。
文字列を汎用コンテナに入れて使うときはちょっと面倒。char*もといTCHAR*を直接コンテナに入れると、
要素の削除やコンテナの解放時に勝手に解放してくれるわけない。それに連想記憶を使うときに
キー一致がポインタ値で判定されるので、中身の文字列で判定されなくてだめぽ。
だからstringコンテナを使う。TCHARに対応したstringはないので、

typedef std::basic_string<TCHAR> tstring;

と定義する。で、

std::map<tstring, tstring> testmap;
testmap[_T("key")] = tstring(_T("value"));

とかやる。これなら元の文字列をそのまま渡すと内部でコピーして領域確保してくれる。
コンテナの解放時にstringのデストラクタで中身の文字列も解放してくれる。
これでキーワードに対応するパスを連想記憶から検索して起動できた。大変だった。