我正在尝试在Windows 10计算机上使用C#获取Windows版本。

我总是得到这些值(使用C#\C++):



这是Windows 8操作系统accordingly to MSDN

C#代码:

var major = OperatingSystem.Version.Major
var minor  = OperatingSystem.Version.Minor

C++代码
void print_os_info()
{
    //http://stackoverflow.com/questions/1963992/check-windows-version
    OSVERSIONINFOW info;
    ZeroMemory(&info, sizeof(OSVERSIONINFOW));
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);

    LPOSVERSIONINFOW lp_info = &info;
    GetVersionEx(lp_info);

    printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);
}

Windows 10可能具有以下功能:


  • (当我从正在运行的进程中获取转储文件时,我可以看到该文件的操作系统版本设置为10.0)



    我在这里想念什么?

    最佳答案

    由于可接受的答案仅适用于C#,因此这里是C++的解决方案。

    它在ntdll.dll中使用RtlGetVersion,该dll与GetVersionEx使用相同的结构(名称不同,但元素相同),并为您提供正确的版本。
    由于此函数通常用于驱动程序开发,因此该函数在DDK中声明,而不在SDK中声明。因此,我使用了动态解决方案来调用该函数。
    请注意,每次调用都会加载并释放ntdll.dll。因此,如果您更经常需要该功能,请保持加载库。

    pOSversion指向的结构必须像GetVersionEx一样进行初始化。

    BOOL GetTrueWindowsVersion(OSVERSIONINFOEX* pOSversion)
    {
       // Function pointer to driver function
       NTSTATUS (WINAPI *pRtlGetVersion)(
          PRTL_OSVERSIONINFOW lpVersionInformation) = NULL;
    
       // load the System-DLL
       HINSTANCE hNTdllDll = LoadLibrary("ntdll.dll");
    
       // successfully loaded?
       if (hNTdllDll != NULL)
       {
          // get the function pointer to RtlGetVersion
          pRtlGetVersion = (NTSTATUS (WINAPI *)(PRTL_OSVERSIONINFOW))
                GetProcAddress (hNTdllDll, "RtlGetVersion");
    
          // if successfull then read the function
          if (pRtlGetVersion != NULL)
             pRtlGetVersion((PRTL_OSVERSIONINFOW)pOSversion);
    
          // free the library
          FreeLibrary(hNTdllDll);
       } // if (hNTdllDll != NULL)
    
       // if function failed, use fallback to old version
       if (pRtlGetVersion == NULL)
          GetVersionEx((OSVERSIONINFO*)pOSversion);
    
       // always true ...
       return (TRUE);
    } // GetTrueWindowsVersion
    

  • 09-10 04:34
    查看更多