VC++ 获取Windows系统版本号、CPU名称
转载:https://blog.csdn.net/sunflover454/article/details/51525179
转载:https://blog.csdn.net/magictong/article/details/40753519
转载:https://blog.csdn.net/ryu2003/article/details/52064494
- #include <iostream>
- #include <Windows.h>
- #include <atlstr.h>
- #pragma warning(disable : 4996)
- CString GetSystemName()
- {
- SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
- GetSystemInfo(&info); //调用GetSystemInfo函数填充结构
- OSVERSIONINFOEX os;
- os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
- CString osname = L"unknown OperatingSystem.";
- if (GetVersionEx((OSVERSIONINFO *)&os))
- {
- //下面根据版本信息判断操作系统名称
- switch (os.dwMajorVersion)//判断主版本号
- {
- case :
- switch (os.dwMinorVersion)//判断次版本号
- {
- case :
- if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
- osname = L"Microsoft Windows NT 4.0"; //1996年7月发布
- else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
- osname = L"Microsoft Windows 95";
- break;
- case :
- osname = L"Microsoft Windows 98";
- break;
- case :
- osname = L"Microsoft Windows Me";
- break;
- }
- break;
- case :
- switch (os.dwMinorVersion) //再比较dwMinorVersion的值
- {
- case :
- osname = L"Microsoft Windows 2000";//1999年12月发布
- break;
- case :
- osname = L"Microsoft Windows XP";//2001年8月发布
- break;
- case :
- if (os.wProductType == VER_NT_WORKSTATION
- && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
- {
- osname = L"Microsoft Windows XP Professional x64 Edition";
- }
- else if (GetSystemMetrics(SM_SERVERR2) == )
- osname = "Microsoft Windows Server 2003";//2003年3月发布
- else if (GetSystemMetrics(SM_SERVERR2) != )
- osname = L"Microsoft Windows Server 2003 R2";
- break;
- }
- break;
- case :
- switch (os.dwMinorVersion)
- {
- case :
- if (os.wProductType == VER_NT_WORKSTATION)
- osname = L"Microsoft Windows Vista";
- else
- osname = L"Microsoft Windows Server 2008";//服务器版本
- break;
- case :
- if (os.wProductType == VER_NT_WORKSTATION)
- osname = L"Microsoft Windows 7";
- else
- osname = L"Microsoft Windows Server 2008 R2";
- break;
- case :
- if (os.wProductType == VER_NT_WORKSTATION)
- osname = L"Microsoft Windows 8";
- else
- osname = L"Microsoft Windows Server 2012";
- break;
- case :
- if (os.wProductType == VER_NT_WORKSTATION)
- osname = L"Microsoft Windows 8.1";
- else
- osname = L"Microsoft Windows Server 2012 R2";
- break;
- }
- break;
- case :
- switch (os.dwMinorVersion)
- {
- case :
- if (os.wProductType == VER_NT_WORKSTATION)
- osname = L"Microsoft Windows 10";
- else
- osname = L"Microsoft Windows Server 2016 Technical Preview";//服务器版本
- break;
- }
- break;
- }
- }
- return osname;
- }
- int main()
- {
- CString strOSversion = GetSystemName();
- return ;
- }
注:现在系统升级很快,这对软件开发人员来说是个打击,测试起来太麻烦,要考虑的兼容性问题也越来越多,坑也越来越多。。。
虽然核心代码就一个函数:GetVersionEx,但是Win8.1和Win10获取到的版本缺一直是6.2(Win8)
仔细阅读微软说明:https://msdn.microsoft.com/en-us/library/ms724832.aspx
问题的原因:简单讲就是兼容问题。可以通过修改manifest文件解决,也可以采用新的API来获取版本号。
由于新的API在低版本操作系统没有,还要特别处理,我们干脆使用修改manifest文件的方法,提高程序自身的兼容性,从而得到正确的系统版本信息。
- <?xml version="1.0" encoding="UTF-8"?>
- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
- <application>
- <!-- Windows 10 -->
- <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
- <!-- Windows 8.1 -->
- <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
- <!-- Windows Vista -->
- <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
- <!-- Windows 7 -->
- <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
- <!-- Windows 8 -->
- <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
- </application>
- </compatibility>
- </assembly>
代码不变,只需要把项目属性设置一下就好了
配置目标那里选则所有配置,配置属性->清单工具->输入和输出-附加清单文件 填写compatibility.xml,并把这个文件拷贝到项目源代码目录。
具体设置如下图所示:
2.获取CPU名称、内核数目、主频
转载:https://blog.csdn.net/github_37567324/article/details/79925776
- #include <iostream>
- #include <Windows.h>
- void GetCpuInfo(CString &chProcessorName, CString &chProcessorType, DWORD &dwNum, DWORD &dwMaxClockSpeed)
- {
- CString strPath = _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注册表子键路径
- CRegKey regkey;//定义注册表类对象
- LONG lResult;//LONG型变量-反应结果
- lResult = regkey.Open(HKEY_LOCAL_MACHINE, LPCTSTR(strPath), KEY_ALL_ACCESS); //打开注册表键
- if (lResult != ERROR_SUCCESS)
- {
- return;
- }
- WCHAR chCPUName[] = { };
- DWORD dwSize = ;
- //获取ProcessorNameString字段值
- if (ERROR_SUCCESS == regkey.QueryStringValue(_T("ProcessorNameString"), chCPUName, &dwSize))
- {
- chProcessorName = chCPUName;
- }
- //查询CPU主频
- DWORD dwValue;
- if (ERROR_SUCCESS == regkey.QueryDWORDValue(_T("~MHz"), dwValue))
- {
- dwMaxClockSpeed = dwValue;
- }
- regkey.Close();//关闭注册表
- //UpdateData(FALSE);
- //获取CPU核心数目
- SYSTEM_INFO si;
- memset(&si, , sizeof(SYSTEM_INFO));
- GetSystemInfo(&si);
- dwNum = si.dwNumberOfProcessors;
- switch (si.dwProcessorType)
- {
- case PROCESSOR_INTEL_386:
- {
- chProcessorType.Format(_T("Intel 386 processor"));
- }
- break;
- case PROCESSOR_INTEL_486:
- {
- chProcessorType.Format(_T("Intel 486 Processor"));
- }
- break;
- case PROCESSOR_INTEL_PENTIUM:
- {
- chProcessorType.Format(_T("Intel Pentium Processor"));
- }
- break;
- case PROCESSOR_INTEL_IA64:
- {
- chProcessorType.Format(_T("Intel IA64 Processor"));
- }
- break;
- case PROCESSOR_AMD_X8664:
- {
- chProcessorType.Format(_T("AMD X8664 Processor"));
- }
- break;
- default:
- chProcessorType.Format(_T("未知"));
- break;
- }
- }
- int main()
- {
- CString chProcessorName, chProcessorType;
- DWORD dwNum, dwMaxClockSpeed;
- GetCpuInfo(chProcessorName,chProcessorType,dwNum,dwMaxClockSpeed);
- return ;
- }
VC++ 获取Windows系统版本号、CPU名称的更多相关文章
- VC++ 获取windows系统的版本类型
vc中获取windows版本信息,一般是调用GetVersionEx 这个API函数来获取的,这个API需要OSVERSIONINFOEX 这个结构体作为参数,OSVERSIONINFOEX 的对应的 ...
- C# 获取Windows系统:Cpu使用率,内存使用率,Mac地址,磁盘使用率
一.获取CPU使用率: #region 获取CPU使用率 #region AIP声明 [DllImport("IpHlpApi.dll")] ...
- 也谈如何获取真实正确的 Windows 系统版本号
关于 GetVersion 系列接口 关于如何获取 Windows 系统版本号的话题,网上已经有了太多的帖子.但个人觉得总结的都不尽全面,或者没有给出比较稳定的解决方案. 众所周知,获取 Window ...
- C/C++获取Windows系统CPU和内存及硬盘使用情况
//1.获取Windows系统内存使用率 //windows 内存 使用率 DWORD getWin_MemUsage(){ MEMORYSTATUS ms; ::GlobalMemoryStatus ...
- Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件
由于公司现阶段大多数应用软件都是基于Windows系统开发和部署,很多软件安装部署都是在windows server 2012.windows server 2008之类的服务器上,部门同事每次测试一 ...
- 通过PowerShell获取Windows系统密码Hash
当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...
- Windows系统版本号判定那些事儿
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- 获取Windows系统中的所有可用和在用串口
目的:获取Windows系统中的所有可用和在用串口 方法:注册表查询法 优点:简单.实用.快速.无遗漏,无多余结果. 说明:另外还有8种方法可以枚举串口,但都不如此法. 代码和详细注释如下: //-- ...
- [源码]一键获取windows系统登陆密码vc6版源码
[源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...
随机推荐
- LineRenderer组建实现激光效果
在射击游戏中狙击一般都有一个红外线的效果.比如
- 漏洞复现:Struts2 S2-032 漏洞环境
Struts2 S2-032 漏洞环境 http://vulapps.evalbug.com/s_struts2_s2-032/ POC: http://127.0.0.1/memoindex.act ...
- 封装及调用fetch
一.封装fetch 创建fetch/index.js import 'whatwg-fetch' import 'es6-promise' export function get(url) { let ...
- HashMap(JDK1.8)
四个构造函数: 构造方法只是赋值属性初始值但是不会真正初始化数组表空间,在第一次添加元素时形成数组表空间.这个和以往的jDK1.7之前的不同,1.7之前的都是在构造里初始化了table数组空间. ...
- 检索系统向量化计算query-doc相似度
def cal_sim2(A,B): ''' A :query [1,2] B: answers [[1,2],[3,5]] ''' need_norm=False A = np.array(A) B ...
- Yii2 Gridview查询关联筛选
- codeforces 980D Perfect Groups
题意: 有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数. 问最少可以分成的组数k是多少. 现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问 ...
- codeoforces 975B Mancala
题意: 一个游戏,有14个洞,每个洞中开始有若干个球或者没有球. 每一步的操作,是将一个洞中的所有球取出,再逆时针放一个球到它的后一个洞,后两个洞,后三个洞....如果当前放的是最后一个,那么下一个又 ...
- ReactiveCocoa(I)
ReactiveCocoa常见类 1. RAC中最核心的类RACSiganl: RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据 解析: 信号类 ...
- [openjudge-动态规划]摘花生
题目描述 描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来.地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生 ...