Windows 8.1 導入記念記事。
Windowsボタンは復活するもののスタートメニューは復活しないなど、とても中途半端な対応で、あまり注目を集めていない、Windows 8.1が公開されました。Windows 8からは、Windowsストアから無料でダウンロードできます。
というわけで、さっそくインストールしてみることにしました。
5時間くらい経過しているはずなのですが、なかなか終わりません。おそらく、背後でフルバックアップとかバックアップデータを圧縮とか、余計なことを行っているのかもしれません。
結局、いつまで経っても終わらないので、パソコンを放置して出勤し、帰宅後に再び様子を見てみることにしましたところ、無事に終わっておりました。さすがに14時間も経てば終わるか。
さて、ここからが本題。
コマンドプロンプトを立ち上げれば分かるとおり、Windows 8.1の内部バージョン番号は 6.3.9600 となっています。
そのため、バージョン番号からWindowsの名前を導くとしたら、GetVersionEx() APIによりメジャーバージョン(6)とマイナーバージョン(3)を得て、判定する仕組みが簡単かと思います。
実際、それを期待しているロジックは既に組み込まれており、「いじくるつくーる」と「すっきり!! デフラグ」は、そこを見て「Windows 8.1なら、動作未確認である旨、警告メッセージを表示する」機能が搭載されています。
いた…はずでした。
それが、動いていないことが判明しました。ためしに、CCPU でバージョン番号を表示させてみると…
なぜだか Windows 8と同じ結果が返ってきています。おかしいなと思い、ググってみると、どうやら、マニフェストファイル(〜.exe.manifest)に、Windows 8.1に対応することの宣言をしないと、GetVersionEx() API が古いバージョン番号を返すような仕様に変わってしまったみたいなんですね。
というわけで、実行ファイルのマニフェストの記載を以下のようにします。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> : : (途中省略) : <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> </application> </compatibility> </assembly>
赤い部分が肝心の記述でして、これが Windows 8.1に対応しているという宣言になります。これがないと、GetVersionEx() は、偽装した結果を返すことになります。
さて、改めて、CCPUを見てみると、
無事に、Windows 8.1であると判別されました。その結果、
Windows 8.1では動作未確認である旨のダイアログを表示できました。
それにしても「Windows 8.1に対応していないことを表示するプログラムは、Windows 8.1への対応を宣言しなければならない」というのは、なんとも面白い話ですね。
というわけで「Windows 8.1では動作未確認である旨を警告する」機能の修正を施した いじくるつくーる と すっきり!! デフラグ の公開を行っています。さすがに、対応しているかどうかも分からないOS上で、暴れられては困ってしまいますからね。
Windows 10についても、新しいsupportedOSを追加しないといけないようです。2014/10/2時点のWindows 10 Technical Preview版(内部ver.6.4.9841)では、次のような情報を追加する必要がありました。(もちろん、今後変更されてしまう可能性も否定できませんが、あくまで今のところという情報で)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> : : (途中省略) : <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> </application> </compatibility> </assembly>