获取windows版本信息的做法
作者:朱金灿
来源:http://blog.csdn.net/clever101
个人不建议用 GetVersion 或GetVersionEx 之类的 API 来获取系统版本号。注意微软也说过,这个结果会受到兼容模式的影响,即如果程序设置兼容模式为 XP 那么拿到的也可能是 5.1 的。所以要准确的获取版本号,我建议直接获取 kernel32.dll 的主版本号,这个是和系统的版本号是一样的。
下面是我写的一个获取windows版本信息的两个函数,供大家参考:
// 具体版本信息参考Operating System Version https://msdn.microsoft.com/en-us/library/ms724832.aspx
enum enOsInfo
{
OS_UNKNOWN = 0, // 未知的操作系统
OS_WIN_NT_3_5, // win nt 4.0,1996年7月发布
OS_WIN_95, // win 95
OS_WIN_98,
OS_WIN_ME, // windows me
OS_WIN_2000,
OS_WIN_XP,
OS_WIN_XP_64, // win xp 64位
OS_WIN_SERVER2003,
OS_WIN_SERVER2003_R2,
OS_WIN_VISTA,
OS_WIN_SERVER2008,
OS_WIN_SERVER2008_R2,
OS_WIN7,
OS_WIN7_64,
OS_WIN_SERVER2012,
OS_WIN8, //6.2
OS_WIN8_64,
OS_WIN_SERVER2012_R2,
OS_WIN8_1 // 6.3
}; bool GetWindowsVersion(int& nMajorVersion,int& nMinorVersion,int& nBuildVersion,int& nReviVersion)
{
TCHAR szDLLName[MAX_PATH] = { 0 };
HRESULT hr = SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL, SHGFP_TYPE_CURRENT, szDLLName);
if (SUCCEEDED(hr) && PathAppend(szDLLName, _T("kernel32.dll")))
{
DWORD dwVerInfoSize = GetFileVersionInfoSize(szDLLName, NULL);
if (dwVerInfoSize > 0) {
LPVOID pvVerInfoData = (LPVOID)new BYTE[dwVerInfoSize];
if (GetFileVersionInfo(szDLLName, 0, dwVerInfoSize, pvVerInfoData)) {
UINT ulLength = 0;
VS_FIXEDFILEINFO* pVsInfo = NULL;
if (VerQueryValue(pvVerInfoData, _T("\\"), (LPVOID *)&pVsInfo, &ulLength))
{
nMajorVersion = HIWORD(pVsInfo->dwFileVersionMS);
nMinorVersion = LOWORD(pVsInfo->dwFileVersionMS);
nBuildVersion = HIWORD(pVsInfo->dwFileVersionLS);
nReviVersion = LOWORD(pVsInfo->dwFileVersionLS);
delete[] pvVerInfoData;
return true;
}
}
delete[] pvVerInfoData;
}
}
return false;
} enOsInfo GetOsInfo()
{
enOsInfo os_info = OS_UNKNOWN; int nMajorVersion,nMinorVersion,nBuildVersion,nReviVersion;
if(GetWindowsVersion( nMajorVersion,nMinorVersion,nBuildVersion,nReviVersion))
{
switch(nMajorVersion)
{
case 3:
{
os_info = OS_WIN_NT_3_5;
break;
}
case 4:
{
switch(nMinorVersion)
{
case 0:
os_info = OS_WIN_95;
break;
case 1:
os_info = OS_WIN_98;
break;
case 9:
os_info = OS_WIN_ME;
break;
default:
break;
}
break;
}
case 5:
{
switch(nMinorVersion)
{
case 0:
os_info = OS_WIN_2000;
break;
case 1:
os_info = OS_WIN_XP;
break;
case 2:
{
SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
GetNativeSystemInfo(&info); //调用GetSystemInfo函数填充结构
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if(GetVersionEx((OSVERSIONINFO *)&os))
{
if(os.wProductType==VER_NT_WORKSTATION
&&(info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64||
info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64))
{
os_info = OS_WIN_XP_64;
}
else if(GetSystemMetrics(SM_SERVERR2)==0)
os_info = OS_WIN_SERVER2003; //2003年3月发布
else if(GetSystemMetrics(SM_SERVERR2)!=0)
os_info = OS_WIN_SERVER2003_R2;
}
break;
}
default:
break;
}
break;
}
case 6:
{
SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
GetNativeSystemInfo(&info); //调用GetSystemInfo函数填充结构
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if(!GetVersionEx((OSVERSIONINFO *)&os))
break; switch(nMinorVersion)
{
case 0:
{
if(os.wProductType == VER_NT_WORKSTATION)
os_info = OS_WIN_VISTA;
else
os_info = OS_WIN_SERVER2008;
break;
}
case 1:
if(os.wProductType == VER_NT_WORKSTATION)
{
if(info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
||info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
os_info = OS_WIN7_64;
else
os_info = OS_WIN7;
}
else
os_info = OS_WIN_SERVER2008_R2;
break;
case 2:
{
if(os.wProductType == VER_NT_WORKSTATION)
{
if(info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
||info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
os_info = OS_WIN8_64;
else
os_info = OS_WIN8;
}
else
os_info = OS_WIN_SERVER2012;
break;
}
case 3:
{
if(os.wProductType == VER_NT_WORKSTATION)
{
os_info = OS_WIN8_1;
}
else
os_info = OS_WIN_SERVER2012_R2;
break;
}
default:
break;
}
break;
}
default:
break;
}
}
return os_info;
}
参考文献:
2. GetVersionEx 如何区分win8和win8.1
获取windows版本信息的做法的更多相关文章
- 获取windows版本信息
procedure TForm1.Button1Click(Sender: TObject); Var OSVI:OSVERSIONINFO; begin OSVI.dwOSversi ...
- Delphi调用API函数获取Windows目录信息、获取System目录信息、获取Temp临时文件目录信息
var Str1, Str2: Array[..Max_Path]of Char;//开辟缓冲区 Str3: Array[..]of Char; begin GetWindowsDirectory(@ ...
- C#获取apk版本信息
获取很多人都会问我为什么要写这个博客,原因很简单,这次研发apk版本信息的时候网上查了很多的资料都没有这方面的信息,因此这次功能完了想写下方法,如果以后博友们遇到了可以直接copy,不用花很多的时间, ...
- Powershell 获取文件版本信息
获取文件版本信息,通过FileVersionInfo::GetVersioninfo(file) 来获取信息 function Check-DdpstoreFileVersion{ $Ddpstore ...
- Python使用wmi获取Windows相关信息
在使用Python获取Windows系统上的相关的信息可以使用WMI接口来获取, 什么是wmi? WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监 ...
- iOS 获取应用版本信息
现在许多接口都需要上传应用版本信息,所以呢,这个是必不可少的,可以在进入应用的时候先获取到,然后存在单例中,用的时候直接调用单例就好了,记住这些字符串 NSString *executableFile ...
- 怎样快速免费获取Windows版本的ZBrush
ZBrush是一款专业的3D绘制软件及数字雕刻软件,随着3D技术的不断进步,ZBrush也是越来越受到业内欢迎,在世界拥有了众多的粉丝和爱好者.相信很多用户对软件的体验就是从使用的版本开始的,本文就教 ...
- js获取浏览器版本信息整理
一.Navigator 对象 JavaScript Navigator 对象包含了有关访问者浏览器的所有信息.接下来我们学习 Navigator 对象的两个属性. appName 保存浏览器类型 ap ...
- C#获取文件版本信息
使用FileVersionInfo获取版本信息 FileVersionInfo info = FileVersionInfo.GetVersionInfo(Application.Current.St ...
随机推荐
- Object-C,NSArraySortTest,数组排序3种方式
晚上回来,继续写Object-C的例子,今天不打算写iOS可视化界面的程序,太累了. 刚刚dady又电话过来,老一套,烦死了. 其实,我一直一个观点,无论发生什么事情,不要整天一副不开心的样子. 开开 ...
- spring boot启动STS 运行报错 java.lang.NoClassDefFoundError: ch/qos/logback/classic/LoggerContext
spring boot启动STS 运行报错 java.lang.NoClassDefFoundError: ch/qos/logback/classic/LoggerContext 学习了: http ...
- XCL-Chart柱形图的期望线/分界线
周日在柱形图上加了两个小功能,当中之中的一个是加上了期望线/分界线,功能非常小,但我个人非常喜欢这个功能(好像之前也没看到别的图表库原生支持这个. ) 主要是加上这些小小的横线后,能非常明显的区分出数 ...
- EBS OAF开发中怎样通过ReferenceAO进行验证
EBS OAF开发中怎样通过ReferenceAO进行验证 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) Reference AO 除了用于 ...
- js中Json字符串如何转成Json对象(4种转换方式)
js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...
- Redis允许远程连接
默认安装启动redis后,只能本地连接,无法远程连接上,原因是redis安全策略默认本机访问,所以远程访问的话需要将 配置文件redis.cof 中的 bind 127.0.0.1 前面的#注释掉, ...
- 7. 关于IntelliJ IDEA删除项目
转自:https://www.cnblogs.com/zhangqian27/p/7698148.html 刚开始使用IDEA . 自己创建项目玩,结果发现IDEA无法删除,我也是醉了,Eclipse ...
- ip反查域名的详细信息(多种方法)
不多说,直接上干货! 至于这里怎FQ,很简单,请见我下面的博客! kali 2.0安装 lantern(成功FQ) shadowsocks(简称SSFQ软件)步骤详解 FQ软件lantern-inst ...
- Kali linux 2016.2(Rolling)中metasploit的端口扫描
目前常见的端口扫描技术一般有如下几类: TCP Connect.TCP SYN.TCP ACK.TCP FIN. Metasploit中的端口扫描器 Metasploit的辅助模块中提供了几款实用的 ...
- [HNOI2008]水平可见直线 单调栈
题目描述:在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=- ...