获取系统硬件信息

来源:互联网 发布:南方数据粘贴 编辑:程序博客网 时间:2024/05/16 15:08

由于项目需要,要求做一个服务器的实时性能监控(CPU、内存、网络利用率等)和读取服务器的硬件配置参数的接口供项目组使用,就是一个类似于鲁大师之类的东东吧...

    还有一种方案就是--->“强大”的WMI,.net平台的程序员可能对这个比较熟悉,WMI即windows管理规范。通过它可以访问、配置、管理和监视几乎所有的Windows资源。当然对于程序员而言在WMI体系结构中我们最需要关心的就是WMI提供的程序和接口。

    WMI提供程序在WMI和托管资源之间扮演着中间方的角色。提供程序代表使用者应用程序和脚本从WMI托管资源请求信息,并发送指令到WMI托管资源。
下面是我们利用WMI编程经常要用到的WMI内置提供程序清单,以供编程参考。

1.Active Directory提供程序 
链接库文件:dsprov.dll 
命名空间:rootdirectoryldap 
作用:将Active Directory 对象映射到 WMI。 

2.事件日志提供程序 
链接库文件:ntevt.dll 
命名空间:rootcimv2 
作用:管理 Windows 事件日志,例如,读取、备份、清除、复制、删除、监视、重命名、压缩、解压缩和更改事件日志设置。 

3.注册表提供程序 
链接库文件:stdprov.dll 
命名空间:rootdefault 
作用:读取、写入、枚举、监视、创建、删除注册表项和值。 

4.Win32 提供程序 
链接库文件:cimwin32.dll 
命名空间:rootcimv2 
作用:提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组,以及更多资源的信息。 

5.Windows 安装程序提供程序 
链接库文件:msiprov.dll 
命名空间:rootcimv2 
作用:提供对已安装软件信息的访问。

  以上可以看出WMI中的类被分组到不同的命名空间中,所以我们在调用相应的程序库时要注意引入对应的命名空间~~~我们今天用到的库就是cimwin32.dll库(第4个)。
好,废话到此为止,还有不懂的自己下去慢慢研究:现在看代码...

 

一、基于API方式的实现代码,简单的对部分API函数的封装:

1、GetSysInfo.h文件

 
[cpp] view plain copy
  1. pragma once    
  2.     
  3.      #include <afxtempl.h>    
  4.     
  5.      class GetSysInfo    
  6.      {    
  7.      public:    
  8.     GetSysInfo(void);    
  9.     ~GetSysInfo(void);    
  10.     
  11.      public:    
  12.         
  13.     void GetOSVersion(CString &strOSVersion,CString &strServiceVersion);    
  14.     BOOL IsWow64();//判断是否为64位操作系统    
  15.     
  16.         
  17.     int  GetInterFaceCount();    
  18.     void GetInterFaceName(CString &InterfaceName,int pNum);       
  19.     void GetMemoryInfo(CString &dwTotalPhys,CString &dwTotalVirtual);       
  20.     void GetCpuInfo(CString &chProcessorName,CString &chProcessorType,DWORD &dwNum,DWORD &dwMaxClockSpeed);        
  21.     void GetDiskInfo(DWORD &dwNum,CString chDriveInfo[]);    
  22.     void GetDisplayCardInfo(DWORD &dwNum,CString chCardName[]);    
  23.      private:    
  24.     CStringList Interfaces;                       //保存所有网卡的名字    
  25.     CList < DWORDDWORD &>       Bandwidths;   //各网卡的带宽    
  26.     CList < DWORDDWORD &>       TotalTraffics;    //各网卡的总流量    
  27.      };   


2.GetSysInfo.cpp文件

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

    以上就是对系统API的简单封装,可以看出用的最多的就是RegOpenKeyEx、RegQueryValueEx之类的查询注册表的函数,基本上所有系统信息都可以通过注册表查到,所以...感兴趣的童鞋有空可以去研究研究注册表~~~~~~这里只是提供一个思路也许有更好的方法来实现~~~求交流~~


二、通过WMI(windows管理规范)接口编程来实现系统硬件信息的获取~~这个相较于上面API方式就方便多了~~~使用起来是相当的方面~~~但是....但是.....这个他妈的实在是太慢了~~~~~比上面的API方式要慢很多倍~~~我没有试过WMI在.net平台下的效果,但至少在MFC工程里面是相当的慢,看代码~~

1、WMIInfo.h文件

[cpp] view plain copy
  1. <span style="background-color: rgb(255, 255, 255);">#pragma once    
  2. #include <atlbase.h>    
  3. #include <afxpriv.h>    
  4. #include <WbemIdl.h>    
  5. #pragma comment(lib,"WbemUuid.lib")    
  6.     
  7. class CWmiInfo    
  8. {    
  9. public:    
  10.     CWmiInfo(void);    
  11.     ~CWmiInfo(void);    
  12.     
  13. public:    
  14.     HRESULT InitWmi();    //初始化WMI    
  15.     HRESULT ReleaseWmi(); //释放    
  16.     
  17.             
  18.     BOOL GetSingleItemInfo(CString,CString,CString&);<pre class="cpp" name="code" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); ">        BOOL GetGroupItemInfo(CString,CString[],int,CString&);    
  19.     
  20. private:    
  21.     void VariantToString(const LPVARIANT,CString &) const;//将Variant类型的变量转换为CString    
  22. private:    
  23.     IEnumWbemClassObject* m_pEnumClsObj;    
  24.     IWbemClassObject* m_pWbemClsObj;    
  25.     IWbemServices* m_pWbemSvc;    
  26.     IWbemLocator* m_pWbemLoc;    
  27. };    
  28. 2.WMIInfo.CPP文件  
  29. view plain  
  30. #include "StdAfx.h"    
  31. #include "WmiInfo.h"    
  32.     
  33. CWmiInfo::CWmiInfo(void)    
  34. {    
  35.     m_pWbemSvc=NULL;    
  36.     m_pWbemLoc=NULL;    
  37.     m_pEnumClsObj = NULL;    
  38. }    
  39.     
  40. CWmiInfo::~CWmiInfo(void)    
  41. {    
  42.     m_pWbemSvc=NULL;    
  43.     m_pWbemLoc=NULL;    
  44.     m_pEnumClsObj = NULL;    
  45. }    
  46.     
  47. HRESULT CWmiInfo::InitWmi()    
  48. {    
  49.     HRESULT hr;    
  50.     
  51. //一、初始化COM组件    
  52.     //初始化COM    
  53.     hr=::CoInitializeEx(0,COINIT_MULTITHREADED);    
  54.     if (SUCCEEDED(hr) || RPC_E_CHANGED_MODE == hr)    
  55.     {    
  56.         //设置进程的安全级别,(调用COM组件时在初始化COM之后要调用CoInitializeSecurity设置进程安全级别,否则会被系统识别为病毒)    
  57.         hr=CoInitializeSecurity(NULL,    
  58.             -1,    
  59.             NULL,                       
  60.             NULL,    
  61.             RPC_C_AUTHN_LEVEL_PKT,    
  62.             RPC_C_IMP_LEVEL_IMPERSONATE,    
  63.             NULL,    
  64.             EOAC_NONE,    
  65.             NULL);    
  66.         //VERIFY(SUCCEEDED(hr));    
  67.     
  68.         //二、创建一个WMI命名空间连接    
  69.         //创建一个CLSID_WbemLocator对象    
  70.         hr=CoCreateInstance(CLSID_WbemLocator,    
  71.             0,    
  72.             CLSCTX_INPROC_SERVER,    
  73.             IID_IWbemLocator,    
  74.             (LPVOID*)&m_pWbemLoc);    
  75.         VERIFY(SUCCEEDED(hr));    
  76.     
  77.         //使用m_pWbemLoc连接到"rootcimv2"并设置m_pWbemSvc的指针    
  78.         hr=m_pWbemLoc->ConnectServer(CComBSTR(L"ROOT\CIMV2"),    
  79.             NULL,    
  80.             NULL,    
  81.             0,    
  82.             NULL,    
  83.             0,    
  84.             0,    
  85.             &m_pWbemSvc);    
  86.         VERIFY(SUCCEEDED(hr));    
  87.     
  88.         //三、设置WMI连接的安全性    
  89.         hr=CoSetProxyBlanket(m_pWbemSvc,    
  90.             RPC_C_AUTHN_WINNT,    
  91.             RPC_C_AUTHZ_NONE,    
  92.             NULL,    
  93.             RPC_C_AUTHN_LEVEL_CALL,    
  94.             RPC_C_IMP_LEVEL_IMPERSONATE,    
  95.             NULL,    
  96.             EOAC_NONE);    
  97.         VERIFY(SUCCEEDED(hr));    
  98.     
  99.     }    
  100.     return(hr);    
  101. }    
  102.     
  103. HRESULT CWmiInfo::ReleaseWmi()    
  104. {    
  105.     HRESULT hr;    
  106.     
  107.     if (NULL != m_pWbemSvc)    
  108.     {    
  109.         hr=m_pWbemSvc->Release();    
  110.     }    
  111.     if (NULL != m_pWbemLoc)    
  112.     {    
  113.         hr=m_pWbemLoc->Release();    
  114.     }    
  115.     if (NULL != m_pEnumClsObj)    
  116.     {    
  117.         hr=m_pEnumClsObj->Release();    
  118.     }    
  119.     
  120.     ::CoUninitialize();    
  121.     
  122.     return(hr);    
  123. }    
  124.     
  125. BOOL CWmiInfo::GetSingleItemInfo(CString ClassName,CString ClassMember,CString &chRetValue)    
  126. {    
  127.     USES_CONVERSION;    
  128.     
  129.     CComBSTR query("SELECT * FROM ");    
  130.     VARIANT vtProp;    
  131.     ULONG uReturn;    
  132.     HRESULT hr;    
  133.     BOOL bRet = FALSE;    
  134.     
  135.     if (NULL != m_pWbemSvc)    
  136.     {    
  137.         //查询类ClassName中的所有字段,保存到m_pEnumClsObj中    
  138.         query+=CComBSTR(ClassName);    
  139.         hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,    
  140.             0,&m_pEnumClsObj);    
  141.         if (SUCCEEDED(hr))    
  142.         {    
  143.             //初始化vtProp值    
  144.             VariantInit(&vtProp);    
  145.             uReturn=0;    
  146.     
  147.             //返回从当前位置起的第一个对象到m_pWbemClsObj中    
  148.             hr=m_pEnumClsObj->Next(WBEM_INFINITE,1,&m_pWbemClsObj,&uReturn);    
  149.             if(SUCCEEDED(hr)&&uReturn>0)     
  150.             {    
  151.                 //从m_pWbemClsObj中找出ClassMember标识的成员属性值,并保存到vtProp变量中    
  152.                 hr=m_pWbemClsObj->Get(CComBSTR(ClassMember),0,&vtProp,0,0);    
  153.                 if (SUCCEEDED(hr))    
  154.                 {    
  155.                     VariantToString(&vtProp,chRetValue);    
  156.                     VariantClear(&vtProp);//清空vtProp    
  157.                     bRet = TRUE;    
  158.                 }    
  159.             }    
  160.         }    
  161.     }    
  162.     if(NULL != m_pEnumClsObj)     
  163.     {    
  164.         hr=m_pEnumClsObj->Release();    
  165.         m_pEnumClsObj = NULL;    
  166.     }    
  167.     if(NULL != m_pWbemClsObj)     
  168.     {    
  169.         hr=m_pWbemClsObj->Release();    
  170.         m_pWbemClsObj = NULL;    
  171.     }    
  172.     return bRet;    
  173. }    
  174.     
  175. BOOL CWmiInfo::GetGroupItemInfo(CString ClassName,CString ClassMember[],int n,CString &chRetValue)    
  176. {    
  177.     USES_CONVERSION;    
  178.     
  179.     CComBSTR query("SELECT * FROM ");    
  180.     CString result,info;    
  181.     VARIANT vtProp;    
  182.     ULONG uReturn;    
  183.     HRESULT hr;    
  184.     int i;    
  185.     BOOL bRet = FALSE;    
  186.     if (NULL  != m_pWbemSvc)    
  187.     {    
  188.         query+=CComBSTR(ClassName);    
  189.         hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,0,&m_pEnumClsObj);    
  190.         if (SUCCEEDED(hr))    
  191.         {    
  192.             VariantInit(&vtProp); //初始化vtProp变量    
  193.             if(m_pEnumClsObj)      
  194.             {    
  195.                 Sleep(10);    
  196.                 uReturn=0;    
  197.                 hr=m_pEnumClsObj->Next(WBEM_INFINITE,1,&m_pWbemClsObj,&uReturn);    
  198.                 if (SUCCEEDED(hr) &&uReturn>0)    
  199.                 {    
  200.                     for(i=0;i<n;++i)    
  201.                     {    
  202.                         hr=m_pWbemClsObj->Get(CComBSTR(ClassMember[i]),0,&vtProp,0,0);    
  203.                         if (SUCCEEDED(hr))    
  204.                         {    
  205.                             VariantToString(&vtProp,info);    
  206.                             chRetValue+=info+_T("t");    
  207.                             VariantClear(&vtProp);    
  208.                             bRet = TRUE;    
  209.                         }    
  210.                     }    
  211.                     chRetValue+=_T("rn");    
  212.                 }    
  213.             }    
  214.         }    
  215.     }    
  216.     
  217.     if(NULL != m_pEnumClsObj)    
  218.     {    
  219.         hr=m_pEnumClsObj->Release();    
  220.         m_pEnumClsObj=NULL;    
  221.     }    
  222.     if(NULL != m_pWbemClsObj)    
  223.     {    
  224.         hr=m_pWbemClsObj->Release();    
  225.         m_pWbemClsObj=NULL;    
  226.     }    
  227.     return bRet;    
  228. }    
  229.     
  230. void CWmiInfo::VariantToString(const LPVARIANT pVar,CString &chRetValue) const    
  231. {    
  232.     USES_CONVERSION;    
  233.     
  234.     CComBSTR HUGEP* pBstr;    
  235.     BYTE HUGEP* pBuf;    
  236.     LONG low,high,i;    
  237.     HRESULT hr;    
  238.     
  239.     switch(pVar->vt)    
  240.     {    
  241.     case VT_BSTR:    
  242.         {    
  243.             chRetValue=W2T(pVar->bstrVal);    
  244.         }    
  245.         break;    
  246.     case VT_BOOL:    
  247.         {    
  248.             if(VARIANT_TRUE==pVar->boolVal)     
  249.                 chRetValue="是";    
  250.             else    
  251.                 chRetValue="否";    
  252.         }    
  253.         break;    
  254.     case VT_I4:    
  255.         {    
  256.             chRetValue.Format(_T("%d"),pVar->lVal);    
  257.         }    
  258.         break;    
  259.     case VT_UI1:    
  260.         {    
  261.             chRetValue.Format(_T("%d"),pVar->bVal);    
  262.         }    
  263.         break;    
  264.     case VT_UI4:    
  265.         {    
  266.             chRetValue.Format(_T("%d"),pVar->ulVal);    
  267.         }    
  268.         break;    
  269.     
  270.     case VT_BSTR|VT_ARRAY:    
  271.         {    
  272.             hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBstr);    
  273.             hr=SafeArrayUnaccessData(pVar->parray);    
  274.             chRetValue=W2T(pBstr->m_str);    
  275.         }    
  276.         break;    
  277.     
  278.     case VT_I4|VT_ARRAY:    
  279.         {    
  280.             SafeArrayGetLBound(pVar->parray,1,&low);     
  281.             SafeArrayGetUBound(pVar->parray,1,&high);    
  282.     
  283.             hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBuf);    
  284.             hr=SafeArrayUnaccessData(pVar->parray);    
  285.             CString strTmp;    
  286.             high=min(high,MAX_PATH*2-1);    
  287.             for(i=low;i<=high;++i)    
  288.             {    
  289.                 strTmp.Format(_T("X"),pBuf[i]);    
  290.                 chRetValue+=strTmp;    
  291.             }    
  292.         }    
  293.         break;    
  294.     default:    
  295.         break;    
  296.     }    
  297. }  </span>  

上面就是一个WMI的封装,返回参数均以CString类型返回调用顺序:

1.实例化一个CWmiInfo类对象

2.调用InitWmi()函数初始化COM组件等。。。函数中有说明必须调用InitWmi初始化WMI组件,否则所有调用都无意义。

3.调用GetXXX方法获取你要获取的字段值。

4.最后使用完CWmiInfo类对象之后一定要记得调用ReleaseWmi()函数来释放资源

调用说明:

WMI的字段类名好像都是以Win32_开头。。。。如:Win32_Processor,Win32_PhysicalMemory等等。。。所以,你只要在MSDN输入Win32_就会看到很多以WMI结尾的类了。。。剩下的就是你的English水平问题了,这里google也可以帮你,如果你需要的话。

下面给大家列出一些常用的类名:

view plain
  1.  // 硬件信息类名  
  2. Win32_Processor, // CPU 处理器  
  3. Win32_PhysicalMemory, // 物理内存条  
  4. Win32_Keyboard, // 键盘  
  5. Win32_PointingDevice, // 点输入设备,包括鼠标。  
  6. Win32_FloppyDrive, // 软盘驱动器  
  7. Win32_DiskDrive, // 硬盘驱动器  
  8. Win32_CDROMDrive, // 光盘驱动器  
  9. Win32_BaseBoard, // 主板  
  10. Win32_BIOS, // BIOS 芯片  
  11. Win32_ParallelPort, // 并口  
  12. Win32_SerialPort, // 串口  
  13. Win32_SerialPortConfiguration, // 串口配置  
  14. Win32_SoundDevice, // 多媒体设置,一般指声卡。  
  15. Win32_SystemSlot, // 主板插槽 (ISA PCI AGP)  
  16. Win32_USBController, // USB 控制器  
  17. Win32_NetworkAdapter, // 网络适配器  
  18. Win32_NetworkAdapterConfiguration, // 网络适配器设置  
  19. Win32_Printer, // 打印机  
  20. Win32_PrinterConfiguration, // 打印机设置  
  21. Win32_PrintJob, // 打印机任务  
  22. Win32_TCPIPPrinterPort, // 打印机端口  
  23. Win32_POTSModem, // MODEM  
  24. Win32_POTSModemToSerialPort, // MODEM 端口  
  25. Win32_DesktopMonitor, // 显示器  
  26. Win32_DisplayConfiguration, // 显卡  
  27. Win32_DisplayControllerConfiguration, // 显卡设置  
  28. Win32_VideoController, // 显卡细节。  
  29. Win32_VideoSettings, // 显卡支持的显示模式。  
  30.   
  31. // 操作系统  
  32. Win32_TimeZone, // 时区  
  33. Win32_SystemDriver, // 驱动程序  
  34. Win32_DiskPartition, // 磁盘分区  
  35. Win32_LogicalDisk, // 逻辑磁盘  
  36. Win32_LogicalDiskToPartition, // 逻辑磁盘所在分区及始末位置。  
  37. Win32_LogicalMemoryConfiguration, // 逻辑内存配置  
  38. Win32_PageFile, // 系统页文件信息  
  39. Win32_PageFileSetting, // 页文件设置  
  40. Win32_BootConfiguration, // 系统启动配置  
  41. Win32_ComputerSystem, // 计算机信息简要  
  42. Win32_OperatingSystem, // 操作系统信息  
  43. Win32_StartupCommand, // 系统自动启动程序  
  44. Win32_Service, // 系统安装的服务  
  45. Win32_Group, // 系统管理组  
  46. Win32_GroupUser, // 系统组帐号  
  47. Win32_UserAccount, // 用户帐号  
  48. Win32_Process, // 系统进程  
  49. Win32_Thread, // 系统线程  
  50. Win32_Share, // 共享  
  51. Win32_NetworkClient, // 已安装的网络客户端  
  52. Win32_NetworkProtocol, // 已安装的网络协议  

   在、msdn中输入相应的类名即可查看个类中包括的类成员及其含义~~

  以上代码均已在vs2008中编译通过~~~~可以直接使用~~~~~~有不当的地方请指教!!

原创粉丝点击