windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码

GetsysInfo.h:

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifndef _H_GETSYSINFO  
  2. #define _H_GETSYSINFO  
  3.   
  4.   
  5. #pragma once  
  6.   
  7. #include <afxtempl.h>  
  8.   
  9. class GetSysInfo  
  10. {  
  11. public:  
  12.     GetSysInfo(void);  
  13.     ~GetSysInfo(void);  
  14.   
  15. public:  
  16.     /********获取操作系统版本,Service pack版本、系统类型************/  
  17.     void GetOSVersion(CString &strOSVersion,CString &strServiceVersion);  
  18.     BOOL IsWow64();//判断是否为64位操作系统  
  19.   
  20.     /***********获取网卡数目和名字***********/  
  21.     int  GetInterFaceCount();  
  22.     void GetInterFaceName(CString &InterfaceName,int pNum);  
  23.   
  24.     /***获取物理内存和虚拟内存大小***/  
  25.     void GetMemoryInfo(CString &dwTotalPhys,CString &dwTotalVirtual);  
  26.   
  27.     /****获取CPU名称、内核数目、主频*******/  
  28.     void GetCpuInfo(CString &chProcessorName,CString &chProcessorType,DWORD &dwNum,DWORD &dwMaxClockSpeed);  
  29.   
  30.     /****获取硬盘信息****/  
  31.     void GetDiskInfo(DWORD &dwNum,CString chDriveInfo[]);  
  32.   
  33.     /****获取显卡信息*****/  
  34.     void GetDisplayCardInfo(DWORD &dwNum,CString chCardName[]);  
  35. private:  
  36.     CStringList Interfaces;                       //保存所有网卡的名字  
  37.     CList < DWORDDWORD &>       Bandwidths;   //各网卡的带宽  
  38.     CList < DWORDDWORD &>       TotalTraffics;    //各网卡的总流量  
  39. };  
  40.   
  41. #endif  


 

 

 

Getsysinfo.cpp:

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "StdAfx.h"  
  2. #include "GetsysInfo.h"  
  3. #include <atlbase.h>  
  4. #include "float.h"  
  5. #include "winperf.h"  
  6.   
  7. GetSysInfo::GetSysInfo(void)  
  8. {  
  9. }  
  10.   
  11. GetSysInfo::~GetSysInfo(void)  
  12. {  
  13. }  
  14.   
  15. void GetSysInfo::GetOSVersion(CString &strOSVersion,CString &strServiceVersion)  
  16. {  
  17.     CString str;  
  18.     OSVERSIONINFOEX osvi;  
  19.     SYSTEM_INFO si;  
  20.     BOOL bOsVersionInfoEx;  
  21.   
  22.     ZeroMemory(&si, sizeof(SYSTEM_INFO));  
  23.     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));  
  24.   
  25.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  
  26.     if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )  
  27.     {  
  28.         osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);  
  29.         GetVersionEx ( (OSVERSIONINFO *) &osvi);  
  30.     }  
  31.   
  32.   
  33.     GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),   
  34.         "GetNativeSystemInfo");  
  35.   
  36.     GetSystemInfo(&si);  
  37.     switch (osvi.dwPlatformId)  
  38.     {  
  39.     case VER_PLATFORM_WIN32_NT:  
  40.         if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )  
  41.         {  
  42.             if( osvi.wProductType == VER_NT_WORKSTATION )  
  43.             {  
  44.                 str.Format(_T("Windows Vista "));  
  45.             }  
  46.             else   
  47.             {  
  48.                 str.Format(_T("Windows Server \"Longhorn\" "));  
  49.             }  
  50.         }  
  51.         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )  
  52.         {  
  53.             if( GetSystemMetrics(SM_SERVERR2) )  
  54.             {  
  55.                 str.Format(_T("Microsoft Windows Server 2003 \"R2\" "));  
  56.             }  
  57.             else if( osvi.wProductType == VER_NT_WORKSTATION &&  
  58.                 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)  
  59.             {  
  60.                 str.Format(_T("Microsoft Windows XP Professional x64 Edition "));  
  61.             }  
  62.             else   
  63.             {  
  64.                 str.Format(_T("Microsoft Windows Server 2003, "));  
  65.             }  
  66.         }  
  67.   
  68.         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )  
  69.         {  
  70.             str.Format(_T("Microsoft Windows XP "));  
  71.         }  
  72.   
  73.         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )  
  74.             str.Format(_T("Microsoft Windows 2000 "));  
  75.   
  76.         if ( osvi.dwMajorVersion <= 4 )  
  77.         {  
  78.             str.Format(_T("Microsoft Windows NT "));  
  79.         }  
  80.   
  81.         // Test for specific product on Windows NT 4.0 SP6 and later.  
  82.         if( bOsVersionInfoEx )  
  83.         {  
  84.   
  85.             //将Service Pack 版本保存  
  86.             strServiceVersion.Format(_T("Service Pack %d"),osvi.wServicePackMajor);  
  87.   
  88.             // Test for the workstation type.  
  89.             if ( osvi.wProductType == VER_NT_WORKSTATION &&  
  90.                 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)  
  91.             {  
  92.                 if( osvi.dwMajorVersion == 4 )  
  93.                     str = str + _T("Workstation 4.0");  
  94.                 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )  
  95.                     str = str + _T("Home Edition");  
  96.                 else str = str + _T( "Professional");  
  97.             }  
  98.   
  99.             // Test for the server type.  
  100.             else if ( osvi.wProductType == VER_NT_SERVER ||   
  101.                 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )  
  102.             {  
  103.                 if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)  
  104.                 {  
  105.                     if ( si.wProcessorArchitecture ==  
  106.                         PROCESSOR_ARCHITECTURE_IA64 )  
  107.                     {  
  108.                         if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  
  109.                             str = str + _T("Datacenter Edition for Itanium-based Systems");  
  110.                         else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  
  111.                             str = str + _T("Enterprise Edition for Itanium-based Systems");  
  112.                     }  
  113.   
  114.                     else if ( si.wProcessorArchitecture ==  
  115.                         PROCESSOR_ARCHITECTURE_AMD64 )  
  116.                     {  
  117.                         if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  
  118.                             str = str + _T( "Datacenter x64 Edition ");  
  119.                         else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  
  120.                             str = str + _T( "Enterprise x64 Edition ");  
  121.                         else str = str + _T( "Standard x64 Edition ");  
  122.                     }  
  123.   
  124.                     else  
  125.                     {  
  126.                         if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  
  127.                             str = str + _T( "Datacenter Edition ");  
  128.                         else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  
  129.                             str = str + _T( "Enterprise Edition ");  
  130.                         else if ( osvi.wSuiteMask & VER_SUITE_BLADE )  
  131.                             str = str + _T( "Web Edition ");  
  132.                         else str = str + _T( "Standard Edition ");  
  133.                     }  
  134.                 }  
  135.                 else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)  
  136.                 {  
  137.                     if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  
  138.                         str = str + _T("Datacenter Server ");  
  139.                     else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  
  140.                         str = str + _T( "Advanced Server ");  
  141.                     else str = str + _T( "Server ");  
  142.                 }  
  143.                 else  // Windows NT 4.0   
  144.                 {  
  145.                     if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  
  146.                         str = str + _T ("Server 4.0, Enterprise Edition ");  
  147.                     else str = str + _T ( "Server 4.0 " );  
  148.                 }  
  149.             }  
  150.         }  
  151.         // Test for specific product on Windows NT 4.0 SP5 and earlier  
  152.         else    
  153.         {  
  154.             HKEY hKey;  
  155.             TCHAR szProductType[256];  
  156.             DWORD dwBufLen=256*sizeof(TCHAR);  
  157.             LONG lRet;  
  158.   
  159.             lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,  
  160.                 _T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hKey );  
  161.             if( lRet != ERROR_SUCCESS )  
  162.                 strOSVersion = str;  
  163.                 return;  
  164.   
  165.             lRet = RegQueryValueEx( hKey, TEXT("ProductType"),  
  166.                 NULL, NULL, (LPBYTE) szProductType, &dwBufLen);  
  167.             RegCloseKey( hKey );  
  168.   
  169.             if( (lRet != ERROR_SUCCESS) ||  
  170.                 (dwBufLen > 256*sizeof(TCHAR)) )  
  171.                 strOSVersion = str;  
  172.                 return;  
  173.   
  174.             if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 )  
  175.                 str = str + _T( "Workstation ");  
  176.             if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 )  
  177.                 str = str + _T( "Server " );  
  178.             if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 )  
  179.                 str = str + _T( "Advanced Server ");  
  180.             str.Format(_T( "%d.%d "), osvi.dwMajorVersion, osvi.dwMinorVersion );  
  181.         }  
  182.   
  183.         // Display service pack (if any) and build number.  
  184.   
  185.         if( osvi.dwMajorVersion == 4 &&   
  186.             lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 )  
  187.         {   
  188.             HKEY hKey;  
  189.             LONG lRet;  
  190.   
  191.             // Test for SP6 versus SP6a.  
  192.             lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,  
  193.                 _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey );  
  194.             if( lRet == ERROR_SUCCESS )  
  195.                 str.Format(_T( "Service Pack 6a (Build %d)\n"),   
  196.                 osvi.dwBuildNumber & 0xFFFF );           
  197.             else // Windows NT 4.0 prior to SP6a  
  198.             {  
  199.                 _tprintf( TEXT("%s (Build %d)\n"),  
  200.                     osvi.szCSDVersion,  
  201.                     osvi.dwBuildNumber & 0xFFFF);  
  202.             }  
  203.   
  204.             RegCloseKey( hKey );  
  205.         }  
  206.         else // not Windows NT 4.0   
  207.         {  
  208.             _tprintf( TEXT("%s (Build %d)\n"),  
  209.                 osvi.szCSDVersion,  
  210.                 osvi.dwBuildNumber & 0xFFFF);  
  211.         }  
  212.   
  213.         break;  
  214.   
  215.         // Test for the Windows Me/98/95.  
  216.     case VER_PLATFORM_WIN32_WINDOWS:  
  217.   
  218.         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)  
  219.         {  
  220.             str.Format(_T("Microsoft Windows 95 "));  
  221.             if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')  
  222.                 str = str + _T("OSR2 ");  
  223.         }   
  224.   
  225.         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)  
  226.         {  
  227.             str.Format(_T("Microsoft Windows 98 "));  
  228.             if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')  
  229.                 str = str + _T("SE ");  
  230.         }   
  231.         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)  
  232.         {  
  233.             str.Format(_T("Microsoft Windows Millennium Edition\n"));  
  234.         }   
  235.         break;  
  236.   
  237.     case VER_PLATFORM_WIN32s:  
  238.         str.Format(_T("Microsoft Win32s\n"));  
  239.         break;  
  240.     default:  
  241.         break;  
  242.     }  
  243.   
  244.     strOSVersion = str;  
  245. }  
  246.   
  247. BOOL GetSysInfo::IsWow64()   
  248. {   
  249.     typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLEPBOOL);   
  250.     LPFN_ISWOW64PROCESS fnIsWow64Process;   
  251.     BOOL bIsWow64 = FALSE;   
  252.     fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(_T("kernel32")),"IsWow64Process");   
  253.     if (NULL != fnIsWow64Process)   
  254.     {   
  255.         fnIsWow64Process(GetCurrentProcess(),&bIsWow64);  
  256.     }   
  257.     return bIsWow64;   
  258. }   
  259.   
  260. void GetSysInfo::GetCpuInfo(CString &chProcessorName,CString &chProcessorType,DWORD &dwNum,DWORD &dwMaxClockSpeed)  
  261. {  
  262.   
  263.     CString strPath=_T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注册表子键路径  
  264.     CRegKey regkey;//定义注册表类对象  
  265.     LONG lResult;//LONG型变量-反应结果  
  266.     lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS); //打开注册表键  
  267.     if (lResult!=ERROR_SUCCESS)  
  268.     {  
  269.         return;  
  270.     }  
  271.     WCHAR chCPUName[50] = {0};  
  272.     DWORD dwSize=50;   
  273.   
  274.     //获取ProcessorNameString字段值  
  275.     if (ERROR_SUCCESS == regkey.QueryStringValue(_T("ProcessorNameString"),chCPUName,&dwSize))  
  276.     {  
  277.         chProcessorName = chCPUName;  
  278.     }  
  279.   
  280.     //查询CPU主频  
  281.     DWORD dwValue;  
  282.     if (ERROR_SUCCESS == regkey.QueryDWORDValue(_T("~MHz"),dwValue))  
  283.     {  
  284.         dwMaxClockSpeed = dwValue;  
  285.     }  
  286.     regkey.Close();//关闭注册表  
  287.     //UpdateData(FALSE);  
  288.   
  289.     //获取CPU核心数目  
  290.     SYSTEM_INFO si;  
  291.     memset(&si,0,sizeof(SYSTEM_INFO));  
  292.     GetSystemInfo(&si);  
  293.     dwNum = si.dwNumberOfProcessors;  
  294.   
  295.     switch (si.dwProcessorType)  
  296.     {  
  297.     case PROCESSOR_INTEL_386:  
  298.         {  
  299.             chProcessorType.Format(_T("Intel 386 processor"));  
  300.         }  
  301.         break;  
  302.     case PROCESSOR_INTEL_486:  
  303.         {  
  304.             chProcessorType.Format(_T("Intel 486 Processor"));  
  305.         }  
  306.         break;  
  307.     case PROCESSOR_INTEL_PENTIUM:  
  308.         {  
  309.             chProcessorType.Format(_T("Intel Pentium Processor"));  
  310.         }  
  311.         break;  
  312.     case PROCESSOR_INTEL_IA64:  
  313.         {  
  314.             chProcessorType.Format(_T("Intel IA64 Processor"));  
  315.         }  
  316.         break;  
  317.     case PROCESSOR_AMD_X8664:  
  318.         {  
  319.             chProcessorType.Format(_T("AMD X8664 Processor"));  
  320.         }  
  321.         break;  
  322.     default:  
  323.         chProcessorType.Format(_T("未知"));  
  324.         break;  
  325.     }  
  326.   
  327.     //GetDisplayName()  
  328. }  
  329.   
  330. void  GetSysInfo::GetMemoryInfo(CString &dwTotalPhys,CString &dwTotalVirtual)   
  331. {   
  332.     //   TODO:     Add   extra   initialization   here   
  333.     MEMORYSTATUS   Mem;   
  334.     //   get   the   memory   status   
  335.     GlobalMemoryStatus(&Mem);   
  336.   
  337.     DWORD dwSize = (DWORD)Mem.dwTotalPhys/(1024*1024);   
  338.     DWORD dwVirtSize = (DWORD)Mem.dwTotalVirtual/(1024*1024);  
  339.   
  340.     dwTotalPhys.Format(_T("物理内存:%ld MB"),dwSize);   
  341.     dwTotalVirtual.Format(_T("虚拟内存:%ld MB"),dwVirtSize);  
  342. }  
  343.   
  344. int GetSysInfo::GetInterFaceCount()  
  345. {  
  346.     /*CGetNetData pNet; 
  347.     DWORD pCount = pNet.GetNetworkInterfacesCount(); 
  348.     return pCount;*/  
  349.   
  350.   
  351.     try  
  352.     {  
  353. #define DEFAULT_BUFFER_SIZE 40960L  
  354.   
  355.         unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE);  
  356.         DWORD type;  
  357.         DWORD size = DEFAULT_BUFFER_SIZE;  
  358.         DWORD ret;  
  359.   
  360.         char s_key[4096];  
  361.         sprintf_s(s_key , 4096 , "510");  
  362.         //RegQueryValueEx的固定调用格式          
  363.         CString str(s_key);  
  364.   
  365.         //如果RegQueryValueEx函数执行失败则进入循环  
  366.         while((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, str, 0, &type, data, &size)) != ERROR_SUCCESS)  
  367.         {  
  368.             Sleep(10);  
  369.             //如果RegQueryValueEx的返回值为ERROR_MORE_DATA(申请的内存区data太小,不能容纳RegQueryValueEx返回的数据)  
  370.             if(ret == ERROR_MORE_DATA)   
  371.             {  
  372.                 Sleep(10);  
  373.                 size += DEFAULT_BUFFER_SIZE;  
  374.                 data = (unsigned char*) realloc(data, size);//重新分配足够大的内存  
  375.   
  376.                 ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, str, 0, &type, data, &size);//重新执行RegQueryValueEx函数  
  377.             }   
  378.             //如果RegQueryValueEx返回值仍旧未成功则函数返回.....(注意内存泄露“free函数”~~~)。  
  379.             //这个if保证了这个while只能进入一次~~~避免死循环  
  380.             if(ret != ERROR_SUCCESS)  
  381.             {  
  382.                 if (NULL != data)  
  383.                 {  
  384.                     free(data);  
  385.                     data = NULL;  
  386.                 }  
  387.                 return 0;//0个接口  
  388.             }  
  389.         }  
  390.   
  391.         //函数执行成功之后就是对返回的data内存中数据的解析了,这个建议去查看MSDN有关RegQueryValueEx函数参数数据结构的说明  
  392.         //得到数据块       
  393.         PERF_DATA_BLOCK  *dataBlockPtr = (PERF_DATA_BLOCK *)data;  
  394.         //得到第一个对象  
  395.         PERF_OBJECT_TYPE *objectPtr = (PERF_OBJECT_TYPE *) ((BYTE *)dataBlockPtr + dataBlockPtr->HeaderLength);  
  396.   
  397.         for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++)   
  398.         {  
  399.             char nameBuffer[255] = {0};  
  400.             if(objectPtr->ObjectNameTitleIndex == 510)   
  401.             {  
  402.                 DWORD processIdOffset = ULONG_MAX;  
  403.                 PERF_COUNTER_DEFINITION *counterPtr =(PERF_COUNTER_DEFINITION *) ((BYTE *)objectPtr + objectPtr->HeaderLength);  
  404.   
  405.                 for(int b=0 ; b<(int)objectPtr->NumCounters ; b++)   
  406.                 {  
  407.                     if(counterPtr->CounterNameTitleIndex == 520)  
  408.                         processIdOffset = counterPtr->CounterOffset;  
  409.   
  410.                     counterPtr =(PERF_COUNTER_DEFINITION *) ((BYTE *) counterPtr + counterPtr->ByteLength);  
  411.                 }  
  412.   
  413.                 if(processIdOffset == ULONG_MAX) {  
  414.                     if(data != NULL)  
  415.                     {  
  416.                         free(data);  
  417.                         data = NULL;  
  418.                     }  
  419.                     return 0;  
  420.                 }  
  421.   
  422.                 PERF_INSTANCE_DEFINITION *instancePtr =(PERF_INSTANCE_DEFINITION *)  ((BYTE *) objectPtr + objectPtr->DefinitionLength);  
  423.   
  424.                 for(int b=0 ; b<objectPtr->NumInstances ; b++)   
  425.                 {  
  426.                     wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);  
  427.                     PERF_COUNTER_BLOCK *counterBlockPtr = (PERF_COUNTER_BLOCK *) ((BYTE *)instancePtr + instancePtr->ByteLength);  
  428.           
  429.                     char pName[256] = {0};  
  430.                     WideCharToMultiByte(CP_ACP, 0, namePtr, -1, pName, sizeof(nameBuffer), 0, 0);  
  431.   
  432.                     DWORD bandwith = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));                
  433.                     DWORD tottraff = 0;  
  434.   
  435.                     Interfaces.AddTail(CString(pName)); //各网卡的名称  
  436.                     Bandwidths.AddTail(bandwith);       //带宽  
  437.                     TotalTraffics.AddTail(tottraff);    // 流量初始化为0  
  438.   
  439.                     PERF_COUNTER_BLOCK  *pCtrBlk = (PERF_COUNTER_BLOCK *) ((BYTE *)instancePtr + instancePtr->ByteLength);  
  440.   
  441.                       
  442.                     instancePtr = (PERF_INSTANCE_DEFINITION *) ((BYTE *)instancePtr + instancePtr->ByteLength + pCtrBlk->ByteLength);  
  443.                 }  
  444.             }  
  445.             objectPtr = (PERF_OBJECT_TYPE *) ((BYTE *)objectPtr + objectPtr->TotalByteLength);  
  446.         }  
  447.         if(data != NULL)  
  448.         {  
  449.             free(data);  
  450.             data = NULL;  
  451.         }  
  452.     }  
  453.     catch(...)  
  454.     {  
  455.         return 0;  
  456.     }  
  457.     return Interfaces.GetCount();  
  458. }  
  459.   
  460. void GetSysInfo::GetInterFaceName(CString &InterfaceName,int pNum)  
  461. {  
  462.     /*CGetNetData pNet; 
  463.     pNet.GetNetworkInterfaceName(&InterfaceName,pNum);*/  
  464.   
  465.     POSITION pos = Interfaces.FindIndex(pNum);  
  466.     if(pos==NULL)  
  467.         return ;  
  468.   
  469.     InterfaceName = Interfaces.GetAt(pos);  
  470.     pos = Bandwidths.FindIndex(pNum);  
  471.     if (pos == NULL)  
  472.         return;  
  473.     DWORD dwBandwidth = Bandwidths.GetAt(pos);  
  474.   
  475.     CString str;  
  476.     str.Format(_T("%d"),dwBandwidth);  
  477.   
  478.     InterfaceName = InterfaceName + str;  
  479. }  
  480.   
  481. void GetSysInfo::GetDiskInfo(DWORD &dwNum,CString chDriveInfo[])  
  482. {  
  483.     DWORD DiskCount = 0;  
  484.   
  485.     //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。  
  486.     DWORD DiskInfo = GetLogicalDrives();  
  487.   
  488.     //通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。  
  489.     while(DiskInfo)  
  490.     {  
  491.         //通过位运算的逻辑与操作,判断是否为1  
  492.         Sleep(10);  
  493.         if(DiskInfo&1)  
  494.         {  
  495.             DiskCount++;  
  496.         }  
  497.         DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。*/  
  498.     }  
  499.   
  500.     if (dwNum < DiskCount)  
  501.     {  
  502.         return;//实际的磁盘数目大于dwNum  
  503.     }  
  504.     dwNum = DiskCount;//将磁盘分区数量保存  
  505.   
  506.   
  507.     //-------------------------------------------------------------------//  
  508.     //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度  
  509.     int DSLength = GetLogicalDriveStrings(0,NULL);  
  510.   
  511.       WCHAR* DStr = new WCHAR[DSLength];  
  512.       memset(DStr,0,DSLength);  
  513.   
  514.       //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。  
  515.       GetLogicalDriveStrings(DSLength,DStr);  
  516.   
  517.       int DType;  
  518.       int si=0;  
  519.       BOOL fResult;  
  520.       unsigned _int64 i64FreeBytesToCaller;  
  521.       unsigned _int64 i64TotalBytes;  
  522.       unsigned _int64 i64FreeBytes;  
  523.   
  524.       //读取各驱动器信息,由于DStr内部数据格式是A:\NULLB:\NULLC:\NULL,所以DSLength/4可以获得具体大循环范围  
  525.       for(int i=0;i<DSLength/4;++i)  
  526.       {  
  527.           Sleep(10);  
  528.           CString strdriver = DStr+i*4;  
  529.           CString strTmp,strTotalBytes,strFreeBytes;  
  530.           DType = GetDriveType(strdriver);//GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录  
  531.           switch (DType)  
  532.           {  
  533.           case DRIVE_FIXED:  
  534.               {  
  535.                   strTmp.Format(_T("本地磁盘"));  
  536.               }  
  537.             break;  
  538.           case DRIVE_CDROM:  
  539.               {  
  540.                   strTmp.Format(_T("DVD驱动器"));  
  541.               }  
  542.               break;  
  543.           case DRIVE_REMOVABLE:  
  544.               {  
  545.                   strTmp.Format(_T("可移动磁盘"));  
  546.               }  
  547.               break;  
  548.           case DRIVE_REMOTE:  
  549.               {  
  550.                   strTmp.Format(_T("网络磁盘"));  
  551.               }  
  552.               break;  
  553.           case DRIVE_RAMDISK:  
  554.               {  
  555.                   strTmp.Format(_T("虚拟RAM磁盘"));  
  556.               }  
  557.               break;  
  558.           case DRIVE_UNKNOWN:  
  559.               {  
  560.                   strTmp.Format(_T("虚拟RAM未知设备"));  
  561.               }  
  562.               break;  
  563.           default:  
  564.               strTmp.Format(_T("未知设备"));  
  565.               break;  
  566.           }  
  567.   
  568.           //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据  
  569.           fResult = GetDiskFreeSpaceEx (strdriver,  
  570.               (PULARGE_INTEGER)&i64FreeBytesToCaller,  
  571.               (PULARGE_INTEGER)&i64TotalBytes,  
  572.               (PULARGE_INTEGER)&i64FreeBytes);  
  573.                 
  574.           if(fResult)  
  575.           {  
  576.               strTotalBytes.Format(_T("磁盘总容量%fMB"),(float)i64TotalBytes/1024/1024);  
  577.               strFreeBytes.Format(_T("磁盘剩余空间%fMB"),(float)i64FreeBytesToCaller/1024/1024);  
  578.           }  
  579.           else  
  580.           {  
  581.               strTotalBytes.Format(_T(""));  
  582.               strFreeBytes.Format(_T(""));  
  583.           }  
  584.           chDriveInfo[i] = strTmp + _T("(") + strdriver + _T("):") + strTotalBytes + strFreeBytes;  
  585.           si+=4;  
  586.       }  
  587. }  
  588.   
  589. void GetSysInfo::GetDisplayCardInfo(DWORD &dwNum,CString chCardName[])  
  590. {  
  591.     HKEY keyServ;  
  592.     HKEY keyEnum;  
  593.     HKEY key;  
  594.     HKEY key2;  
  595.     LONG lResult;//LONG型变量-保存函数返回值  
  596.   
  597.     //查询"SYSTEM\\CurrentControlSet\\Services"下的所有子键保存到keyServ  
  598.     lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Services"),0,KEY_READ,&keyServ);  
  599.     if (ERROR_SUCCESS != lResult)  
  600.         return;  
  601.   
  602.   
  603.     //查询"SYSTEM\\CurrentControlSet\\Enum"下的所有子键保存到keyEnum  
  604.     lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Enum"),0,KEY_READ,&keyEnum);  
  605.     if (ERROR_SUCCESS != lResult)  
  606.         return;  
  607.   
  608.     int i = 0,count = 0;  
  609.     DWORD size = 0,type = 0;  
  610.     for (;;++i)  
  611.     {  
  612.         Sleep(5);  
  613.         size = 512;  
  614.         TCHAR name[512] = {0};//保存keyServ下各子项的字段名称  
  615.   
  616.         //逐个枚举keyServ下的各子项字段保存到name中  
  617.         lResult = RegEnumKeyEx(keyServ,i,name,&size,NULL,NULL,NULL,NULL);  
  618.   
  619.         //要读取的子项不存在,即keyServ的子项全部遍历完时跳出循环  
  620.         if(lResult == ERROR_NO_MORE_ITEMS)  
  621.             break;  
  622.   
  623.         //打开keyServ的子项字段为name所标识的字段的值保存到key  
  624.         lResult = RegOpenKeyEx(keyServ,name,0,KEY_READ,&key);  
  625.         if (lResult != ERROR_SUCCESS)  
  626.         {  
  627.             RegCloseKey(keyServ);  
  628.             return;  
  629.         }  
  630.           
  631.   
  632.         size = 512;  
  633.         //查询key下的字段为Group的子键字段名保存到name  
  634.         lResult = RegQueryValueEx(key,TEXT("Group"),0,&type,(LPBYTE)name,&size);  
  635.         if(lResult == ERROR_FILE_NOT_FOUND)  
  636.         {  
  637.             //?键不存在  
  638.             RegCloseKey(key);  
  639.             continue;  
  640.         };  
  641.   
  642.   
  643.   
  644.         //如果查询到的name不是Video则说明该键不是显卡驱动项  
  645.         if(_tcscmp(TEXT("Video"),name)!=0)  
  646.         {  
  647.             RegCloseKey(key);  
  648.             continue;     //返回for循环  
  649.         };  
  650.           
  651.         //如果程序继续往下执行的话说明已经查到了有关显卡的信息,所以在下面的代码执行完之后要break第一个for循环,函数返回  
  652.         lResult = RegOpenKeyEx(key,TEXT("Enum"),0,KEY_READ,&key2);  
  653.         RegCloseKey(key);  
  654.         key = key2;  
  655.         size = sizeof(count);  
  656.         lResult = RegQueryValueEx(key,TEXT("Count"),0,&type,(LPBYTE)&count,&size);//查询Count字段(显卡数目)  
  657.   
  658.         dwNum = count;//保存显卡数目  
  659.         for(int j=0;j <count;++j)  
  660.         {  
  661.             TCHAR sz[512] = {0};  
  662.             TCHAR name[64] = {0};  
  663.             wsprintf(name,TEXT("%d"),j);  
  664.             size = sizeof(sz);  
  665.             lResult  = RegQueryValueEx(key,name,0,&type,(LPBYTE)sz,&size);  
  666.   
  667.   
  668.             lResult = RegOpenKeyEx(keyEnum,sz,0,KEY_READ,&key2);  
  669.             if (ERROR_SUCCESS)  
  670.             {  
  671.                 RegCloseKey(keyEnum);  
  672.                 return;  
  673.             }  
  674.               
  675.   
  676.             size = sizeof(sz);  
  677.             lResult = RegQueryValueEx(key2,TEXT("FriendlyName"),0,&type,(LPBYTE)sz,&size);  
  678.             if(lResult == ERROR_FILE_NOT_FOUND)  
  679.             {  
  680.                 size = sizeof(sz);  
  681.                 lResult = RegQueryValueEx(key2,TEXT("DeviceDesc"),0,&type,(LPBYTE)sz,&size);  
  682.                 chCardName[j] = sz;//保存显卡名称  
  683.             };  
  684.             RegCloseKey(key2);  
  685.             key2 = NULL;  
  686.         };  
  687.         RegCloseKey(key);  
  688.         key = NULL;  
  689.         break;  
  690.     }  
  691. }  


 

下面是

Test_cpu.cpp:

 

 

 

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // Test_cpu.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. // Test_cpu.cpp : 定义控制台应用程序的入口点。  
  6. //  
  7.   
  8. //=====================================================================================  
  9. /*                 CPUID指令是intel IA32架构下获得CPU信息的汇编指令, 
  10.                    可以得到CPU类型,型号,制造商信息,商标信息,序列号, 
  11.                    缓存等一系列CPU相关的东西。 
  12. */  
  13. #include "stdafx.h"  
  14. //#include <windows.h>  
  15. #include "GetsysInfo.h"  
  16. #include <iostream>  
  17. #include <string>  
  18.   
  19. using namespace std;  
  20.   
  21.   
  22. //用来存储eax,ebx,ecx,edx四个寄存器的信息  
  23. DWORD deax;  
  24. DWORD debx;  
  25. DWORD decx;  
  26. DWORD dedx;  
  27.   
  28. void ExeCPUID(DWORD veax)  //初始化CPU  
  29. {  
  30. __asm  
  31. {  
  32.     mov eax,veax  
  33.     cpuid  
  34.     mov deax,eax  
  35.     mov debx,ebx  
  36.     mov decx,ecx  
  37.     mov dedx,edx  
  38. }  
  39. }  
  40.   
  41. /*    在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件, 
  42.     它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。 
  43.     由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。 
  44.     这个精确性是上述两种方法所无法比拟的。 
  45.     在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter) 
  46.     来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中 
  47. */  
  48. long GetCPUFreq()       //获取CPU频率,单位: MHZ  
  49. {  
  50.     int start,over;  
  51.     _asm   
  52.     {  
  53.         RDTSC  
  54.         mov start,eax  
  55.     }  
  56.     Sleep(50);  
  57.     _asm   
  58.     {  
  59.         RDTSC  
  60.         mov over,eax  
  61.     }  
  62.     return (over-start)/50000;  
  63. }  
  64.   
  65.   
  66.   
  67. /*   把eax = 0作为输入参数,可以得到CPU的制造商信息。 
  68.      cpuid指令执行以后,会返回一个12字符的制造商信息, 
  69.      前四个字符的ASC码按低位到高位放在ebx,中间四个放在edx,最后四个字符放在ecx。 
  70. */  
  71. string GetManID()   //获取制造商信息  
  72. {  
  73.     char ID[25];          
  74.     memset(ID,0,sizeof(ID));  
  75.       
  76.     ExeCPUID(0);          //初始化  
  77.     memcpy(ID+0,&debx,4); //制造商信息复制到数组  
  78.     memcpy(ID+4,&dedx,4);  
  79.     memcpy(ID+8,&decx,4);  
  80.       
  81.     return string(ID);  
  82. }  
  83.   
  84.   
  85. /*  在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息, 
  86.     这就是CPU的商标字符串。CPU的商标字符串也是通过cpuid得到的。 
  87.     由于商标的字符串很长(48个字符),所以不能在一次cpuid指令执行时全部得到, 
  88.     所以intel把它分成了3个操作,eax的输入参数分别是0x80000002,0x80000003,0x80000004, 
  89.     每次返回的16个字符,按照从低位到高位的顺序依次放在eax, ebx, ecx, edx。 
  90.     因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次cpuid。 
  91. */  
  92. string GetCPUType()  
  93. {  
  94.     const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束  
  95.     char CPUType[49];//用来存储CPU型号信息  
  96.     memset(CPUType,0,sizeof(CPUType));//初始化数组  
  97.       
  98.     for(DWORD t = 0 ; t < 3 ; t++ )  
  99.     {  
  100.         ExeCPUID(id+t);  
  101.         //每次循环结束,保存信息到数组  
  102.         memcpy(CPUType+16*t+ 0,&deax,4);  
  103.         memcpy(CPUType+16*t+ 4,&debx,4);  
  104.         memcpy(CPUType+16*t+ 8,&decx,4);  
  105.         memcpy(CPUType+16*t+12,&dedx,4);  
  106.     }  
  107.       
  108.     return string(CPUType);  
  109. }  
  110.   
  111. void main()   
  112. {   
  113.     cout<<"本机CPU信息如下:"<<endl;  
  114.     cout<<"CPU 主 频: "<<GetCPUFreq()<<" MHZ"<<endl;  
  115.     cout<<"CPU 制造商: "<<GetManID()<<endl;  
  116.     cout<<"CPU 型 号: "<<GetCPUType()<<endl;  
  117.    // cin.get();  
  118.   
  119.   
  120.     cout<<"------------------------------------------"<<endl;  
  121.     DWORD dwnum = 0 ;  
  122.     CString info[20];  
  123.     CString totalmemery,totalvirtual;  
  124.     GetSysInfo* sys = new GetSysInfo();  
  125.     //sys->GetDiskInfo(dwnum,info);  
  126.     //sys->GetMemoryInfo(totalmemery,totalvirtual);  
  127.     //wstring total = totalmemery.GetBuffer(0);  
  128.     //wstring processname = chProcessorName.GetBuffer(0);  
  129.     //wcout<<total<<endl;  
  130.     //wcout<<totalvirtual.GetBuffer(0)<<endl;  
  131.   
  132.   
  133.   
  134.     CString chProcessorName;  
  135.     CString chProcessorType;  
  136.     DWORD dwNum;  
  137.     DWORD dwMaxClockSpeed;  
  138.     sys->GetCpuInfo( chProcessorName, chProcessorType, dwNum, dwMaxClockSpeed);  
  139.     //wstring processname = chProcessorName.GetBuffer(0);//unicode要使用对应版本的函数  
  140.     wcout<<chProcessorName.GetBuffer(0)<<endl;  
  141.     wcout<<chProcessorType.GetBuffer(0)<<endl;  
  142.     delete sys;  
  143.   
  144.     getchar();  
  145.   

  1. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值