草庐IT

windows mfc 打印系统信息代码

Sam.Richard 2023-03-28 原文

 

  1 //"[平台:2, 系统:10.0.19044(处理器(586):12), CPU: 12th Gen Intel(R) Core(TM) i5-12400 (2.50GHz), CSD():0.0, 套件掩码:256, 其他信息:1, 内存:15.7GB,虚拟内存:4.0GB]"
  2 //系统版本对照表:https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/operating-system-version 或者 https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/ns-winnt-osversioninfoexa
  3 CString GetOSVersion()
  4 {
  5     //获取cpu名称和主频
  6     CHAR chCPUName[50] = { 0 };//cpu名称
  7     DWORD dwSize = 50;
  8     DWORD dwValue;                //主频值
  9     CString strPath = _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注册表子键路径  
 10     CRegKey regkey;//定义注册表类对象  
 11     LONG lResult;//LONG型变量-反应结果  
 12     lResult = regkey.Open(HKEY_LOCAL_MACHINE, LPCTSTR(strPath), KEY_ALL_ACCESS); //打开注册表键  
 13     if (lResult == ERROR_SUCCESS)
 14     {
 15         //获取ProcessorNameString字段值  
 16         if (ERROR_SUCCESS != regkey.QueryStringValue(_T("ProcessorNameString"), chCPUName, &dwSize))
 17         {
 18             ZeroMemory(chCPUName, sizeof(chCPUName));
 19         }
 20 
 21         //查询CPU主频  
 22         if (ERROR_SUCCESS != regkey.QueryDWORDValue(_T("~MHz"), dwValue))
 23         {
 24             dwValue = 0;
 25         }
 26     }
 27 
 28 
 29     //获取内存信息
 30     MEMORYSTATUSEX statex;
 31     statex.dwLength = sizeof(statex);
 32     GlobalMemoryStatusEx(&statex);
 33     DWORDLONG physical_memory = statex.ullTotalPhys / (1024 * 1024);
 34     DWORDLONG virtual_totalmemory = statex.ullTotalVirtual / (1024 * 1024);
 35 
 36 
 37 
 38     //获取系统信息
 39     CString strOSInfo;
 40     OSVERSIONINFOEX osvi;
 41     SYSTEM_INFO si;
 42     BOOL bOSVersionInfoEx;
 43     ZeroMemory(&si, sizeof(SYSTEM_INFO));
 44     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
 45     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 46     if (!(bOSVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi)))
 47     {
 48         osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 49         GetVersionEx((OSVERSIONINFO*)&osvi);
 50     }
 51 
 52     GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
 53     GetSystemInfo(&si);
 54 
 55     strOSInfo.Format("[平台:%d, 系统:%d.%d.%d(处理器(%d):%d), CPU: %s (%.2fGHz), CSD(%s):%d.%d, 套件掩码:%d, 其他信息:%d, 内存:%.1fGB,虚拟内存:%.1fGB]", osvi.dwPlatformId, osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber,
 56         si.dwProcessorType, si.dwNumberOfProcessors, 
 57         chCPUName, dwValue / 1000.0,
 58         osvi.szCSDVersion, osvi.wServicePackMajor, osvi.wServicePackMinor, osvi.wSuiteMask, osvi.wProductType,
 59         physical_memory / 1024.0, virtual_totalmemory / 1024.0);
 60 
 61     //GetVersionEx may be altered or unavailable for releases after Windows 8.1. Instead
 62     //win8.1之后系统,获取结果都是 6.2
 63     if (osvi.dwMajorVersion >= 6)
 64     {
 65         //定义变量
 66         typedef LONG(__stdcall* fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);
 67         fnRtlGetVersion pRtlGetVersion;
 68         HMODULE hNtdll;
 69         LONG ntStatus = 1;
 70         ULONG    dwMajorVersion = 0;
 71         ULONG    dwMinorVersion = 0;
 72         ULONG    dwBuildNumber = 0;
 73         RTL_OSVERSIONINFOW VersionInformation = { 0 };
 74         DWORD OsVersion;
 75 
 76         do
 77         {
 78             hNtdll = GetModuleHandle("ntdll.dll");
 79             if (hNtdll == NULL)break;
 80 
 81             pRtlGetVersion = (fnRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
 82             if (pRtlGetVersion == NULL)break;
 83 
 84             VersionInformation.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
 85             ntStatus = pRtlGetVersion(&VersionInformation);
 86 
 87             if (ntStatus != 0) break;
 88 
 89             dwMajorVersion = VersionInformation.dwMajorVersion;
 90             dwMinorVersion = VersionInformation.dwMinorVersion;
 91             dwBuildNumber = VersionInformation.dwBuildNumber;
 92 
 93         } while (FALSE);
 94 
 95         if (ntStatus == 0)
 96         {
 97             strOSInfo.Format("[平台:%d, 系统:%d.%d.%d(处理器(%d):%d), CPU: %s (%.2fGHz), CSD(%s):%d.%d, 套件掩码:%d, 其他信息:%d, 内存:%.1fGB,虚拟内存:%.1fGB]", osvi.dwPlatformId, dwMajorVersion, dwMinorVersion, dwBuildNumber,
 98                 si.dwProcessorType, si.dwNumberOfProcessors,
 99                 chCPUName, dwValue/1000.0,
100                 osvi.szCSDVersion, osvi.wServicePackMajor, osvi.wServicePackMinor, osvi.wSuiteMask, osvi.wProductType,
101                 physical_memory / 1024.0, virtual_totalmemory / 1024.0);
102         }
103     }
104     return strOSInfo;
105 }

 

  1 //"[平台:2, 系统:10.0.19044(处理器(586):12), CPU: 12th Gen Intel(R) Core(TM) i5-12400 (2.50GHz), CSD():0.0, 套件掩码:256, 其他信息:1, 内存:15.7GB,虚拟内存:4.0GB]"
  2 //系统版本对照表:https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/operating-system-version 或者 https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/ns-winnt-osversioninfoexa
  3 //By SamRichard https://home.cnblogs.com/u/SamRichard/
  4 CString GetOSVersion()
  5 {
  6     //获取cpu名称和主频
  7     CHAR chCPUName[50] = { 0 };//cpu名称
  8     DWORD dwSize = 50;
  9     DWORD dwValue;                //主频值
 10     CString strPath = _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注册表子键路径  
 11     CRegKey regkey;//定义注册表类对象  
 12     LONG lResult;//LONG型变量-反应结果  
 13     lResult = regkey.Open(HKEY_LOCAL_MACHINE, LPCTSTR(strPath), KEY_ALL_ACCESS); //打开注册表键  
 14     if (lResult == ERROR_SUCCESS)
 15     {
 16         //获取ProcessorNameString字段值  
 17         if (ERROR_SUCCESS != regkey.QueryStringValue(_T("ProcessorNameString"), chCPUName, &dwSize))
 18         {
 19             ZeroMemory(chCPUName, sizeof(chCPUName));
 20         }
 21 
 22         //查询CPU主频  
 23         if (ERROR_SUCCESS != regkey.QueryDWORDValue(_T("~MHz"), dwValue))
 24         {
 25             dwValue = 0;
 26         }
 27     }
 28 
 29 
 30     //获取内存信息
 31     MEMORYSTATUSEX statex;
 32     statex.dwLength = sizeof(statex);
 33     GlobalMemoryStatusEx(&statex);
 34     DWORDLONG physical_memory = statex.ullTotalPhys / (1024 * 1024);
 35     DWORDLONG virtual_totalmemory = statex.ullTotalVirtual / (1024 * 1024);
 36 
 37 
 38 
 39     //获取系统信息
 40     CString strOSInfo;
 41     OSVERSIONINFOEX osvi;
 42     SYSTEM_INFO si;
 43     BOOL bOSVersionInfoEx;
 44     ZeroMemory(&si, sizeof(SYSTEM_INFO));
 45     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
 46     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 47     if (!(bOSVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi)))
 48     {
 49         osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 50         GetVersionEx((OSVERSIONINFO*)&osvi);
 51     }
 52 
 53     GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
 54     GetSystemInfo(&si);
 55 
 56     strOSInfo.Format("[平台:%d, 系统:%d.%d.%d(处理器(%d):%d), CPU: %s (%.2fGHz), CSD(%s):%d.%d, 套件掩码:%d, 其他信息:%d, 内存:%.1fGB,虚拟内存:%.1fGB]", osvi.dwPlatformId, osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber,
 57         si.dwProcessorType, si.dwNumberOfProcessors, 
 58         chCPUName, dwValue / 1000.0,
 59         osvi.szCSDVersion, osvi.wServicePackMajor, osvi.wServicePackMinor, osvi.wSuiteMask, osvi.wProductType,
 60         physical_memory / 1024.0, virtual_totalmemory / 1024.0);
 61 
 62     //GetVersionEx may be altered or unavailable for releases after Windows 8.1. Instead
 63     //win8.1之后系统,获取结果都是 6.2
 64     if (osvi.dwMajorVersion >= 6)
 65     {
 66         //定义变量
 67         typedef LONG(__stdcall* fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);
 68         fnRtlGetVersion pRtlGetVersion;
 69         HMODULE hNtdll;
 70         LONG ntStatus = 1;
 71         ULONG    dwMajorVersion = 0;
 72         ULONG    dwMinorVersion = 0;
 73         ULONG    dwBuildNumber = 0;
 74         RTL_OSVERSIONINFOW VersionInformation = { 0 };
 75         DWORD OsVersion;
 76 
 77         do
 78         {
 79             hNtdll = GetModuleHandle("ntdll.dll");
 80             if (hNtdll == NULL)break;
 81 
 82             pRtlGetVersion = (fnRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
 83             if (pRtlGetVersion == NULL)break;
 84 
 85             VersionInformation.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
 86             ntStatus = pRtlGetVersion(&VersionInformation);
 87 
 88             if (ntStatus != 0) break;
 89 
 90             dwMajorVersion = VersionInformation.dwMajorVersion;
 91             dwMinorVersion = VersionInformation.dwMinorVersion;
 92             dwBuildNumber = VersionInformation.dwBuildNumber;
 93 
 94         } while (FALSE);
 95 
 96         if (ntStatus == 0)
 97         {
 98             strOSInfo.Format("[平台:%d, 系统:%d.%d.%d(处理器(%d):%d), CPU: %s (%.2fGHz), CSD(%s):%d.%d, 套件掩码:%d, 其他信息:%d, 内存:%.1fGB,虚拟内存:%.1fGB]", osvi.dwPlatformId, dwMajorVersion, dwMinorVersion, dwBuildNumber,
 99                 si.dwProcessorType, si.dwNumberOfProcessors,
100                 chCPUName, dwValue/1000.0,
101                 osvi.szCSDVersion, osvi.wServicePackMajor, osvi.wServicePackMinor, osvi.wSuiteMask, osvi.wProductType,
102                 physical_memory / 1024.0, virtual_totalmemory / 1024.0);
103         }
104     }
105     return strOSInfo;
106 }
View Code

 

windowsmfcspancolorstyleC++

有关windows mfc 打印系统信息代码的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  10. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

随机推荐