昨日に引き続き、CLFS。少し試行錯誤してわかってきました。今日やったのはログを追記するあたり。
Appending Records to a Log (Windows)
- CreateLogFileで領域を作り、ポリシーを設定する(自動拡張ポリシーはWindows Server 2003 R2ではうまく動かないみたいなことが書いてある)
- AddLogContainer か AddLogContainerSet でコンテナを作成する。最低二ついるようなことが書いてあるが、私が1レコード書くだけの場合は呼ばなくてもよかった。
- CreateLogMarshallingAreaを呼び出してMarshallingAreaを作成する。COMのIUNKOWNをもらうと思えばいい(なんて乱暴な)。
- ReserveAndAppendLog で実際に追記する。追記する内容は第二引数のPCLFS_WRITE_ENTRY構造体のメンバに指定する。cReserveRecordsとrgcbReservationはNULL指定でも問題なくかけたが、たぶん指定したほうがいいのかもしれない。まだよくわからない。
- FlushLogBuffersでログをフラッシュする。私が試したときはCloseAndResetLogFileで閉じてもFlushLogBuffersを呼び出さないと書いてくれなかった。
- CloseAndResetLogFileでクローズ(?)。
Windows 7 SDKでもCLFSはサンプルがなくて試行錯誤しています。System.IO.Log使うか、非同期書き込みでも十分間に合うのでしょうけど、これでどのくらい性能が変わるか少し試してみたいと思ってます。特にログ書き込みに排他をアプリケーション側が気にしなくていいのがとてもありがたいですね。それと、CLFSも非同期I/Oサポートしているんだ…。