2010年2月17日水曜日

日記ちゃん

 文字列をファイルに書き込む際にうっかり

LPCTSTR str = TEXT("hello");
WriteFile( hFile, str, lstrlen(str), &writeSize, NULL );

みたいなことをやっちゃって、うげー! ってなった。
しかも間違えてたのがパックファイルの部分だったからファイル情報を正しく読めなくなって大暴走。
 
 正しくは

LPCTSTR str = TEXT("hello");
WriteFile( hFile, str, lstrlen(str)*sizeof(*str), &writeSize, NULL );

がおおよそ正しい。
今まで作ったプログラムはUNICODEではないものが多かったのでぜんぜん気が付かなかった。
 
 この文字列をファイルから読むときは1文字分多くメモリを確保しないと'\0'分がないので注意。
でもここはしっかり対策されてたんだから、プログラムはどこでひっかかるか分からんね。
 
 さすがにUnicodeで生成したパックファイルをUnicodeではないプログラムで読むと暴走するのはどうかと思うので、適当にチェックサムでも仕込むことにした。
あんまり根本の解決になってない気もする。
パックファイルはUnicodeで決めうちするとかのほうがまだ安全かなぁ。
 

 そんなこんなで昔作ったこれを再利用してチェックサム使用のパックファイルエディタをちゃちゃっと作成。
チェックサムには、ファイル名の長さ+ファイルサイズ+ファイルデータの書き込み位置をまんま使ったが、意外に正常に動作している。
 当時はタブキーで選択移動が出来なくて何でだろうと思っていたが、IsDialogMessageを忘れていただけだったみたいな。うっかりさん。
 

0 件のコメント: