私的メモ

気が向いたときに更新。(2004年01月版)

2004/01/29 

CString の挙動(_mbsinc()の問題)

VC6 の C Runtime Library の _mbsinc() は、指定文字列をマルチバイト
を意識した文字単位で次の文字へのポインタを返す関数。

この関数にはバグがあり、2byte文字の先頭1byte目で終端している文字列
を与えると、文字列終端を飛び越えて次をさしてしまうトホホなコードに
なっている模様。(_mbsinc(p) { if (isleadbyte(*p++) p++; return p; }

この影響で、これを内部使用している CString でも問題を引き起こし、
例えば、以下のようなコードを実行すると、str.GetLength() が -1 を返し
てしまう。

char test[] = { 0x82, 0x00 };
CString str = test;
str.TrimLeft((unsigned char)0x82);

さらに、_tcsinc(mbsinc) は CString のあちこちで使われていて、CString に、
UTF-8 な文字列を食わせると、似た問題を引き起こし、CString::Find() や
CString::ReverseFind() で適切な文字を見逃してしまう、といった事象に結
びついてしまう。(この場合は、MBCS モードで UTF-8 な文字列を CString
に食わせるのが間違いといえなくもないけれど)

なお、非UNICODE ビルドかつ _MBCS を定義している環境でのみ発生する様子。

2004/01/21 

高速削除ツール(fast_rm)

Explorer の削除のあまりの遅さと、問い合わせの鬱陶しさに、高速削除ツール
(コンソールアプリ)を自作。(高速コピーツールはまだ未完…)

いくつか計測した範囲では、かなり高速に削除可能だったけれど、
やや危険なツールではあるので、使いたい方はお気をつけてどうぞ。
fast_rm050.lzh 説明 ソース

あと、気が向いたら、ウィンドウベースにするかも。個人的には cygwin 環境から
使うつもりなので、コマンドラインで十分ではあるけれど。

(ちなみに、cygwin 環境の rm -rf がかなり遅いのは、内部で使っている lstat()
 エミュレーションの頑張りすぎ(リンクカウンタ調査)が原因かな?)

2004/01/14 

ipmsg

Dialog Proc では WM_QUERYENDSESSION に対して、返した値が、なぜか
逆に解釈されてしまう模様。(SPY++ で見るとメッセージの戻り値自体が、
なぜか反転されて伝わっている。暗黙の DefDlgProc() 効果?とも思ったが、
戻りが TRUE の場合も FALSE に逆転している…)

v2.05 で認証化のための布石を少し入れる。
ただ、多言語対応等を考えると、いずれはプロトコル一新かな。
(新プロトコルへのリクエスト等ありましたら、私か ipmsg-ML までどうぞ)

とはいえ、新プロトコル対応バージョンを作成した場合も、現プロトコル版
と通信可能な状態にするつもりではあるけれど。

書籍

昔から、「いずれは読むつもりリスト」に入れていた「ニューロマンサー」と、
新刊のクルーグマン本を買う。

 12月のメモ index 2月のメモ
ipmsgicon
ご意見・ご感想はこちらまで:email

..up menu

Copyright(C) 2004 SHIROUZU Hiroaki