Windows 8.1ではGetVersionExが6.2と返すらしいというので試してみました。
GetVersionEx function
「Windows 8.1向けと明示(マニフェスト)されていないアプリケーションには6.2と返す」
確かにそうなりました。SupportedOS Idは以下のように。
8.1のIdが指定されていると6.3が、ないと6.2が返りました。
過去のマイクロソフトのスタンスとはずいぶん異なる挙動です。Vista/7ぐらいの頃は「特定のバージョンでしか動かないような実装はやめなさい」と言っていたのに。諦めたということでしょうか。
早くからこの方針が決まっていれば、SupportedOS IdがVistaなら(※)6.0、7なら6.1...ということもできたでしょうが、8.1で今さらこうなったのも妙な気はします。
※Vista当時にSupportedOS Idはなかったので、requestedPrivilegesだけがあれば、といったあたり
それとは別に、マニフェストに関わらず判定できるAPIがあり、Version Helper functionsと称されています。
IsWindows8Point1OrGreater他、任意のバージョンかそれ以上を判定できるのですが、VersionHelpers.hの中にコードが書かれており、中でVerifyVersionInfoを呼んでいました。
実体がVerifyVersionInfoですから、IsWindows8Point1OrGreaterなどの各関数のサポートOS欄には"Windows 2000"と書かれています。
とどのつまり、マニフェストのSupportedOS Idをちゃんと記述しておきましょう、という話ですが、Win32の世界で8以降の目新しいAPIって何かあったかな...。
GetVersionEx function
「Windows 8.1向けと明示(マニフェスト)されていないアプリケーションには6.2と返す」
確かにそうなりました。SupportedOS Idは以下のように。
- {1f676c76-80e1-4239-95bb-83d0f6d0da78} 8.1/2012 R2
- {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38} 8/2012
- {35138b9a-5d96-4fbd-8e2d-a2440225f93a} 7/2008 R2
- {e2011457-1546-43c5-a5fe-008deee3d3f0} Vista/2008
8.1のIdが指定されていると6.3が、ないと6.2が返りました。
過去のマイクロソフトのスタンスとはずいぶん異なる挙動です。Vista/7ぐらいの頃は「特定のバージョンでしか動かないような実装はやめなさい」と言っていたのに。諦めたということでしょうか。
早くからこの方針が決まっていれば、SupportedOS IdがVistaなら(※)6.0、7なら6.1...ということもできたでしょうが、8.1で今さらこうなったのも妙な気はします。
※Vista当時にSupportedOS Idはなかったので、requestedPrivilegesだけがあれば、といったあたり
それとは別に、マニフェストに関わらず判定できるAPIがあり、Version Helper functionsと称されています。
IsWindows8Point1OrGreater他、任意のバージョンかそれ以上を判定できるのですが、VersionHelpers.hの中にコードが書かれており、中でVerifyVersionInfoを呼んでいました。
実体がVerifyVersionInfoですから、IsWindows8Point1OrGreaterなどの各関数のサポートOS欄には"Windows 2000"と書かれています。
とどのつまり、マニフェストのSupportedOS Idをちゃんと記述しておきましょう、という話ですが、Win32の世界で8以降の目新しいAPIって何かあったかな...。
コメントする