21268


ソースコード：

[code]

    #define _WIN32_WINNT 0x0601 //win7
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    int setOsVer(int setOsVer_i);
    
    int majorv;
    int minorv;
    char osname[36];
    
    int main()
    {
    
    OSVERSIONINFOEX OSver;
    ULONGLONG condition = 0;
    OSver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    
    
    
    int i;
    for (i=0; i<7; i++){
        setOsVer(i);
        OSver.dwMajorVersion = majorv;
        OSver.dwMinorVersion = minorv;
        VER_SET_CONDITION( condition, VER_MAJORVERSION, VER_EQUAL);
        VER_SET_CONDITION( condition, VER_MINORVERSION, VER_EQUAL);
    
        if( VerifyVersionInfo( &OSver, VER_MAJORVERSION | VER_MINORVERSION, condition) )
        {
            printf("%s\n", &osname);
            break;
        }
    }
    
    return 0;
    }
    
    int setOsVer(int setOsVer_i)
    {
        switch(setOsVer_i) {
            case 0:
                //windows 2000
                strcpy( osname, "Windows 2000" );
                majorv=5;
                minorv=0;
                break;
            case 1:
                //windows xp
                strcpy( osname, "Windows XP" );
                majorv=5;
                minorv=1;
                break;
            case 2:
                //windows xp professional x64 edition; windows2003server,windows2003serverr2
                strcpy( osname, "Windows XP Professional x64 Edition" );
                majorv=5;
                minorv=2;
                break;
            case 3:
                //windows vista; windowsserver2008
                strcpy( osname, "Windows Vista" );
                majorv = 6;
                minorv = 0;
                break;
            case 4:
                //windows 7; windowsserver2008r2
                strcpy( osname, "Windows 7" );
                majorv = 6;
                minorv = 1;
                break;
            case 5:
                //windows 8; windowsserver2012
                strcpy( osname, "Windows 8" );
                majorv = 6;
                minorv = 2;
                break;
            case 6:
                //windows 8.1
                strcpy( osname, "Windows 8.1" );
                majorv = 6;
                minorv = 3;
                break;
            default:
                return 1;
                break;
        }
    
        return 0;
    }
    
[/code]

８．１までしか書いてないので８．１が出力されると思うんですが、  
これで実行するとWindows 8が出力されます。

何が原因だと思いますか？


CC BY-SA 3.0
2016-01-24T15:06:16.480
21267
2016-01-25T00:27:29.877
13313
question
windows c
Windows10でVerifyVersionInfoAPIを使ってバージョンを調べるとWindows8として認識されます


日本語のドキュメントが見つけられなかったので英語ですみませんが、[MSDN の
VerifyVersionInfo](https://msdn.microsoft.com/en-
us/library/windows/desktop/ms725492\(v=vs.85\).aspx) の、かなり下のほうに

> Applications not manifested for Windows 8.1 or Windows 10 return false  
>  when lpVersionInfo specifies Windows 8.1 or Windows 10, even if the  
>  current operating system version is Windows 8.1 or Windows 10. In  
>  these cases, the operation system version is indicated as Windows 8  
>  (6.2). To manifest your applications for Windows 8.1 or Windows 10,  
>  see [Targeting your application for Windows](https://msdn.microsoft.com/en-
> us/library/windows/desktop/dn481241\(v=vs.85\).aspx#base.version_helper_apis).

とあります。ざっと訳すと

  * マニフェストに Windows 8.1 または 10 用としていないアプリケーションでは、lpVersionInfo に 8.1 または 10 と指定し、実際にそのバージョンのOS上で実行しても、VerifyVersionInfo は false を返す。
  * その場合、Windows 8 と認識される。
  * マニフェストの指定の仕方は、[Targeting your application for Windows](https://msdn.microsoft.com/en-us/library/windows/desktop/dn481241\(v=vs.85\).aspx#base.version_helper_apis) を参照。

ということで、マニフェストがないとダメなようです。


CC BY-SA 3.0
2016-01-24T16:26:31.943
21268
2016-01-24T16:26:31.943
3605
21267
answer


別のドキュメントで[Operating system version changes in Windows 8.1 and Windows Server
2012 R2](https://msdn.microsoft.com/en-us/library/dn302074.aspx)に

> In Windows 8.1, the GetVersion(Ex) APIs have been deprecated. That means
> that while you can still call the APIs, if your app does not specifically
> target Windows 8.1, you will get Windows 8 versioning (6.2.0.0).

とあります。ですのでmanifestがないと6.2（Windows 8）が返されます。


CC BY-SA 3.0
2016-01-25T00:27:29.877
21274
2016-01-25T00:27:29.877
4236
21267
answer