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

时间:2014-09-23 03:20:18

标签: c windows winapi

我注意到GetVersionEx()被声明已弃用。更糟糕的是,对于Windows 8.1(可能是未来的版本),版本号受应用程序清单的限制。

我的目标是收集用户正在运行的操作系统上的分析,以便我可以适当地定位支持。我想要一个收集这些数据的面向未来的解决方案。更新清单不会起作用,因为我只能更新已发布的Windows版本的清单,而不是更新版本。建议的替换API version helper functions没用。

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

澄清:通过" future proofing",我的意思是我想要有一个相当不错的机会在下一个版本的Windows上工作。没有什么是确定的,但文档确实说GetVersionEx()不会起作用。

1 个答案:

答案 0 :(得分:15)

MSDN有an example显示如何使用(对您的方案无用)版本帮助程序函数,但在介绍中如下:

  

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

截至目前,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);