none
C++/CXでOSのバージョンを取得する方法 RRS feed

  • 質問

  • 目的としてはWindows10のバージョンをC++/CXで取得したいです。

    ですが、方法がわかりません。(C#のサンプルは見掛けるのですが)

    また、C#のサンプルではビルド番号が取得されているみたいですが、(10.0.xxx.xxx)

    設定 -> バージョン情報にある、バージョンは取得できないのでしょうか?(1703みたいな)

    理想としては両方取得する方法がわかると嬉しいです。

    2017年10月3日 2:13

回答

  • 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 のバージョンに関しては判別ではなくもっと直接的に取得できる方法があるかもしれませんが、私にはわかりませんでした。

    参考サイト: https://stackoverflow.com/questions/45480191/how-to-check-the-windows-10-os-version-in-an-uwp-app-so-as-to-eliminate-wack-tes

    2017年10月3日 3:32

すべての返信

  • 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 のバージョンに関しては判別ではなくもっと直接的に取得できる方法があるかもしれませんが、私にはわかりませんでした。

    参考サイト: https://stackoverflow.com/questions/45480191/how-to-check-the-windows-10-os-version-in-an-uwp-app-so-as-to-eliminate-wack-tes

    2017年10月3日 3:32
  • kenjinoteさん

    上記のソースで取得することができました。

    全然、OSのバージョンを取得するサンプルがなかったので、

    大変助かりました。ありがとうございます。

    2017年10月3日 6:17