Windows版本识别[C/C++]

4

如何以编程的方式确定当前安装的Windows版本?例如区分vista和xp。

2个回答

6
如果您正在使用Win32,则可以使用GetVersionEx API来识别操作系统。

遗憾的是,自W8以来,GetVersionGetVersionEx已被弃用,取而代之的是VerifyVersionInfo。在我看来,这是一个糟糕的改变。 - Jesse Chisholm

2
这里的直接问题是你想要测试什么?与其比较版本号(因为有各种精简版的Windows),还不如检查功能(check for features)VerifyVersionInfo 可以同时进行两者,并且是比较主/次版本号的推荐方式。
BOOL IsAtLeast2008DC() {

  OSVERSIONINFOEX osvi = {0};
  DWORDLONG mask = 0;

  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  osvi.dwMajorVersion = 6;
  osvi.dwMinorVersion = 0;
  osvi.wServicePackMajor = 0;
  osvi.wServicePackMinor = 0;
  osvi.wProductType = VER_NT_DOMAIN_CONTROLLER;


  VER_SET_CONDITION(mask, VER_MAJORVERSION, VER_GREATER_EQUAL);
  VER_SET_CONDITION(mask, VER_MINORVERSION, VER_GREATER_EQUAL);
  VER_SET_CONDITION(mask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
  VER_SET_CONDITION(mask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
  VER_SET_CONDITION(mask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
  VER_SET_CONDITION(mask, VER_PRODUCT_TYPE, VER_EQUAL);

  return VerifyVersionInfo(&osvi,
      VER_MAJORVERSION | VER_MINORVERSION |
      VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR |
      VER_PRODUCT_TYPE, 
      mask
      );

}

只需测试Vista或更高版本,删除提到产品类型的行。你可以在这里找到更多示例,但要注意你正在检查什么。

虽然这对于测试“当前的Windows版本是否足够满足我的最低需求”是有效的,但它并没有回答GetVersionEx所回答的问题:“我正在运行哪个版本的Windows?”微软似乎不再希望我们问这个问题了。 :( - Jesse Chisholm
是的,这是故意的。虽然另一个评论是直接回答,但通常不是解决问题的正确方法。 - Mark
事实证明,我不需要对任何一个问题做出决定。但是我想要记录用户运行我的程序时所使用的Windows版本。如果没有GetVersionEx的功能,我就无法轻松地完成这个任务。相反,我必须通过一系列“它至少是A吗?”“它至少是B吗?”来估计版本族。直到我找到答案改变的边界为止。这对我的需求来说并不是很令人满意。 - Jesse Chisholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接