やっとのことでプログラムを改良する時間ができたのでWindowModePatchにいろいろと手を加えています。で、その段階で気がついたことを別記事で紹介します。
kernel32になんかいろいろと機能が追加されている
Twitterでもちょっとつぶやいていますが対応OSなどの関係を少し考えてパッチを当てたプログラムのDLLのベース部分をいろいろと操作しているときに気がついたこと。WindowsXPの時代から各種システムDLLにはいろいろな機能(C言語としてみれば関数、英語を訳すと機能でもいいのだが・・・)が追加されていました。あまり新しいWinAPIは見ていないですし、どうせこの後ストアアプリなどで統合が始まるとC言語によるWindowsプログラムの作成はあまり推奨されなくなっていくのかな、と思うので微妙なのですが、それでもちょっと面白いと感じました。
スレッドプールの機能がkernel32に統合されている
まずはこれ。スレッドプールというとあらかじめスレッドを複数個作成しておいて待機させておき、必要なタイミングでタスクを投げ込むように「自前で」作成していたことが多かった機能です。実際、ゲームライブラリのスレッドルーチンや音楽再生時のバッファ転送で自前で作成したスレッドプールを使っていたのでこの機能が簡単に使えるならなんてありがたい、というとこですね。しかもkernel32からなので機能的にはばっちりでしょう。
NTFSでトランザクション処理がユーザー側から使えたのね・・・
NTFSでファイル操作をするときにはトランザクションが使えると言うことですね。これ、一番便利なことはインストーラでファイルをコピーしたときに通常完了するのであれば何事もないのですが、キャンセル動作をされたときに手順を逆にしてコピーしたファイルを削除する、という動作を自前で行わなければならないのですがそれをトランザクションとしてファイルシステム側でなんとかしてくれる、ということですね。WindowsなのでNTFS以外で作った領域にインストールすると言うことも起こるので完全にこれに頼ることはできないと思いますがそれでもうまく使えればありがたい機能ですね。
「拡張の拡張」というすごい関数も
一つ見つけた関数がEnumDateFormatsExExというもの。最後に「ExEx」と二回ついているのがちょっと面白かったです。WinAPIでExがついているのはOSのバージョンアップによりオプションを追加せざるをえなくなった物が多く、たとえばWin3.1の時代に設計された関数をWin95仕様にするときにExをつけてやった、というものが考えられますが、WinVistaなどで再度拡張するとこうなるのはわかるのですがなんともはや・・・。
スレッドプールとファイル処理のトランザクションはうまく使えれば有用
OSのバージョンに微妙に依存するのが問題ですが、新規開発を行うのであればいまさらWinXPをサポートする必要はないでしょうし、こういういい機能であれば積極的に利用したいものですね。