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倍对某些 ...
随机推荐
- Thinkphp 3.2 验证码图片显示错误解决方法
在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $verify = new \Think\Verify(); $verify-& ...
- Mod制作第一个物品
在通过Mod制作第一个物品时需要 一下几个步骤: 创建一个物品 通常在创建这个物品类的时候会继承Item或者是Block父类(因为Mod中的物品都是这个两个类的子类),在给类中使用了this.setU ...
- C#中生成的随机数为什么不随机?
from:https://www.xcode.me/more/net-csharp-generate-random 随机数生成方法可以说是任何编程语言必备的功能,它的重要性不言而言,在C#中我们通常使 ...
- activiti 项目变更控制器
package com.xinwei.process.controller; import java.util.Calendar; import java.util.HashMap; import j ...
- Maximum-SubsequenceSum
题目 https://pintia.cn/problem-sets/900290821590183936/problems/900291257604861953 给出一段数列,求数列的最大子列和,并输 ...
- Sql Server参数化查询之where in和like实现详解 [转]
文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where ...
- QTCreator 调试:unknown debugger type "No engine"
[1]QTCreator调试,应用程序输出:unknown debugger type "No engine" 如图:下断点->调试程序->应用程序输出 说明:调试器无 ...
- 使用Flask-CKEditor集成富文本编辑框
使用Flask-CKEditor集成富文本编辑框 富文本编辑器即所见即所得编辑器,类似于文本编辑软件.它提供一系列按钮和下拉列表来为文本设置格式,编辑状态的文本样式即最终呈现出来的样式.在Web程序中 ...
- rabbitMq 教程
https://github.com/401Studio/WeekLearn/issues/2 目录 RabbitMQ 概念 exchange交换机机制 什么是交换机 binding? Direct ...
- js多个异步请求
一,两个(或多个)js异步并发执行,怎么在两个AJax异步操作之后执行一个新的操作 原题来自 ES6 方法 1.Promise 包装异步ajax操作,2.定义async 函数,3.用await等待pr ...