今日は文字列をリソースよりとりだすクラス(CResource)を作っていました。
PsycleWTLでは多言語対応にするためにソースコード中の言語に依存する文字列をすべてリソースに移そうとしています。
リソースから文字列を読み出すにはLoadString()という関数があるのですが、これは文字列バッファを必要とするうえ呼び出すたびに文字列バッファへのコピーというコストが発生します。
バッファ作成を端折る&コピーコスト削減のためにこのクラスが必要なわけです。
クラス設計ですが、CSimpleMapを使ってクラス構築時にリソースIDをkey、文字列をvalueとして保存しておき、要求があればIDをもとにmap内を検索し、その文字列へのポインタを返すようにしました。
とりあえずさくっとつくりテストしてみたのですが、IDから文字列がひけないようです。
リソース内を列挙するにはEnumResourceNames()を使用しますが、きちんと文字列が列挙できていないようです。
いろいろサイトを調べたところ、ここに解決方法が載っていました。
文字列リソースは列挙のされ方がちょっと変わっていて、コールバック関数の引数をそのまま使用してもだめなのです。
上記の情報にソースを修正したところ、できるようになりました。
修正したソースをに置いときます。