トップ回答者
C++/CXでOSのバージョンを取得する方法

質問
回答
-
OS の内部バージョン(10.0.xxx.xxx)と Windows 10 のバージョン(1703など)は下記のようなコードで取得・判別できるようです。
Windows::System::Profile::AnalyticsVersionInfo^ info = Windows::System::Profile::AnalyticsInfo::VersionInfo; LPWSTR pEnd = nullptr; __int64 v = wcstoll(info->DeviceFamilyVersion->Data(), &pEnd, 10); unsigned long v1 = (v & 0xFFFF000000000000L) >> 48; unsigned long v2 = (v & 0x0000FFFF00000000L) >> 32; unsigned long v3 = (v & 0x00000000FFFF0000L) >> 16; unsigned long v4 = v & 0x000000000000FFFFL; WCHAR szVersion[1024]; swprintf_s(szVersion, L"%lu.%lu.%lu.%lu\r\n", v1, v2, v3, v4); OutputDebugStringW(szVersion);
unsigned long Windows10Version = 0; if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 5)) { Windows10Version = 1709; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 4)) { Windows10Version = 1703; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3)) { Windows10Version = 1607; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2)) { Windows10Version = 1511; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 1)) { Windows10Version = 1507; } if (Windows10Version > 0) { WCHAR szWindows10Version[1024]; swprintf_s(szWindows10Version, L"Windows 10 Version = %lu\r\n", Windows10Version); OutputDebugStringW(szWindows10Version); } else { OutputDebugStringW(L"Windows 10 Version = Unknown\r\n"); }
Windows 10 のバージョンに関しては判別ではなくもっと直接的に取得できる方法があるかもしれませんが、私にはわかりませんでした。
- 編集済み kenjinoteMVP 2017年10月3日 5:55
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月3日 6:50
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年10月4日 6:36
すべての返信
-
OS の内部バージョン(10.0.xxx.xxx)と Windows 10 のバージョン(1703など)は下記のようなコードで取得・判別できるようです。
Windows::System::Profile::AnalyticsVersionInfo^ info = Windows::System::Profile::AnalyticsInfo::VersionInfo; LPWSTR pEnd = nullptr; __int64 v = wcstoll(info->DeviceFamilyVersion->Data(), &pEnd, 10); unsigned long v1 = (v & 0xFFFF000000000000L) >> 48; unsigned long v2 = (v & 0x0000FFFF00000000L) >> 32; unsigned long v3 = (v & 0x00000000FFFF0000L) >> 16; unsigned long v4 = v & 0x000000000000FFFFL; WCHAR szVersion[1024]; swprintf_s(szVersion, L"%lu.%lu.%lu.%lu\r\n", v1, v2, v3, v4); OutputDebugStringW(szVersion);
unsigned long Windows10Version = 0; if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 5)) { Windows10Version = 1709; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 4)) { Windows10Version = 1703; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3)) { Windows10Version = 1607; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2)) { Windows10Version = 1511; } else if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent("Windows.Foundation.UniversalApiContract", 1)) { Windows10Version = 1507; } if (Windows10Version > 0) { WCHAR szWindows10Version[1024]; swprintf_s(szWindows10Version, L"Windows 10 Version = %lu\r\n", Windows10Version); OutputDebugStringW(szWindows10Version); } else { OutputDebugStringW(L"Windows 10 Version = Unknown\r\n"); }
Windows 10 のバージョンに関しては判別ではなくもっと直接的に取得できる方法があるかもしれませんが、私にはわかりませんでした。
- 編集済み kenjinoteMVP 2017年10月3日 5:55
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月3日 6:50
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年10月4日 6:36