アクティベーションコンテキストについて

RubyでFiddleを使ってWindowsAPIを叩けばWindowsアプリを作ることが、まあ、できるというのは検索するとたくさん出てくるのでわりとメジャーな話。しかし普通に作るとボタンなどの見た目がクラシックになってしまう。こんな感じ。

Windows7なら7的な見た目になってほしい。こんな感じに。

この見た目はcomctl32.dllのバージョンに依存する。バージョン6を使うようにすれば見た目が変わるのだが、何もしないとバージョン5が使われる。comctl32.dllは共有side-by-sideアセンブリとしてインストールされていて、バージョン6を使うためにはマニフェストファイルを作ってexeに埋め込む必要がある。が、こちとらRubyでウィンドウを動的に作っているわけで、そんなもんどうやって埋め込むんじゃ、となるわけだ。そこで登場するのがアクティベーションコンテキスト。
WindowsAPIのCreateActCtxでアクティベーションコンテキストを作ってマニフェストファイルを読み込み、ActivateActCtxでアクティブ化してやると、それ以後に生成したコントロールの見た目が変わる。非常にマイナーなAPIで調べるのにちょと苦労したが、確かにできるっぽいのでメモ代わりに記事にしておいた。ソースはこちら
ポイントはマニフェストファイルは何故かどうしてもファイルで指定する必要があるっぽく、テンポラリに吐き出して読むようにしたところ。なんでメモリ内のデータじゃダメなんすかね。