如何以面向未来的方式确定Windows版本

我注意到GetVersionEx()被宣布不推荐使用。 更糟糕的是,对于Windows 8.1(以及可能的未来版本),版本号受应用程序清单的限制。

我的目标是收集用户正在运行的操作系统的分析,所以我可以适当地指定支持。 我想要一个面向未来的解决scheme来收集这些数据。 更新清单将不起作用,因为我只能更新已经发布的Windows版本的清单,而不是将来的版本。 build议的replaceAPI, 版本帮助函数是没用的。

我如何收集实际的Windows版本号?

澄清:通过“未来打样”,我的意思是我希望有一些机会能够在下一个版本的Windows上工作。 没有什么是确定的,但文档确实说GetVersionEx()将无法正常工作。

MSDN有一个例子,展示了如何使用(无用于你的场景)版本的帮助函数,但是在介绍中有以下几点:

要获取操作系统的完整版本号,请在其中一个系统DLL(如coreel32.dll)上调用GetFileVersionInfo函数,然后调用VerQueryValue以获取文件版本信息的\ StringFileInfo \ ProductVersion子块。

截至目前, GetFileVersionInfoVerQueryValue函数都不推荐使用。

这将从kernel32.dll提取产品版本并将其打印到控制台:

 #pragma comment(lib, "version.lib") static const wchar_t kernel32[] = L"\\kernel32.dll"; wchar_t *path = NULL; void *ver = NULL, *block; UINT n; BOOL r; DWORD versz, blocksz; VS_FIXEDFILEINFO *vinfo; path = malloc(sizeof(*path) * MAX_PATH); if (!path) abort(); n = GetSystemDirectory(path, MAX_PATH); if (n >= MAX_PATH || n == 0 || n > MAX_PATH - sizeof(kernel32) / sizeof(*kernel32)) abort(); memcpy(path + n, kernel32, sizeof(kernel32)); versz = GetFileVersionInfoSize(path, NULL); if (versz == 0) abort(); ver = malloc(versz); if (!ver) abort(); r = GetFileVersionInfo(path, 0, versz, ver); if (!r) abort(); r = VerQueryValue(ver, L"\\", &block, &blocksz); if (!r || blocksz < sizeof(VS_FIXEDFILEINFO)) abort(); vinfo = (VS_FIXEDFILEINFO *) block; printf( "Windows version: %d.%d.%d", (int) HIWORD(vinfo->dwProductVersionMS), (int) LOWORD(vinfo->dwProductVersionMS), (int) HIWORD(vinfo->dwProductVersionLS)); free(path); free(ver);