当前位置: 首页 > 编程日记 > 正文

win32 wmi编程获取系统信息

//GetSysInfo.h#pragma once#include <afxtempl.h>class GetSysInfo
{
public:GetSysInfo(void);~GetSysInfo(void);public:
/********获取操作系统版本,Service pack版本、系统类型************/
void GetOSVersion(CString &strOSVersion,CString &strServiceVersion);
BOOL IsWow64();//判断是否为64位操作系统/***********获取网卡数目和名字***********/
int  GetInterFaceCount();
void GetInterFaceName(CString &InterfaceName,int pNum);/***获取物理内存和虚拟内存大小***/
void GetMemoryInfo(CString &dwTotalPhys,CString &dwTotalVirtual);/****获取CPU名称、内核数目、主频*******/
void GetCpuInfo(CString &chProcessorName,CString &chProcessorType,DWORD &dwNum,DWORD &dwMaxClockSpeed);/****获取硬盘信息****/
void GetDiskInfo(DWORD &dwNum,CString chDriveInfo[]);/****获取显卡信息*****/
void GetDisplayCardInfo(DWORD &dwNum,CString chCardName[]);private:
CStringList Interfaces;                  //保存所有网卡的名字
CList < DWORD, DWORD &>        Bandwidths;      //各网卡的带宽
CList < DWORD, DWORD &>        TotalTraffics;    //各网卡的总流量
};


//GetSysInfo.cpp#include "GetSysInfo.h"  
#include "float.h"  
#include "winperf.h"  
#include <atlbase.h>
#include <atlcom.h>GetSysInfo::GetSysInfo(void)  
{  
}  GetSysInfo::~GetSysInfo(void)  
{  
}  void GetSysInfo::GetOSVersion(CString &strOSVersion,CString &strServiceVersion)  
{  CString str;  OSVERSIONINFOEX osvi;  SYSTEM_INFO si;  BOOL bOsVersionInfoEx;  ZeroMemory(&si, sizeof(SYSTEM_INFO));  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )  {  osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);  GetVersionEx ( (OSVERSIONINFO *) &osvi);  }  GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),   "GetNativeSystemInfo");  GetSystemInfo(&si);  switch (osvi.dwPlatformId)  {  case VER_PLATFORM_WIN32_NT:  if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )  {  if( osvi.wProductType == VER_NT_WORKSTATION )  {  str.Format(_T("Windows Vista "));  }  else   {  str.Format(_T("Windows Server \"Longhorn\" "));  }  }  if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )  {  if( GetSystemMetrics(SM_SERVERR2) )  {  str.Format(_T("Microsoft Windows Server 2003 \"R2\" "));  }  else if( osvi.wProductType == VER_NT_WORKSTATION &&  si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)  {  str.Format(_T("Microsoft Windows XP Professional x64 Edition "));  }  else   {  str.Format(_T("Microsoft Windows Server 2003, "));  }  }  if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )  {  str.Format(_T("Microsoft Windows XP "));  }  if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )  str.Format(_T("Microsoft Windows 2000 "));  if ( osvi.dwMajorVersion <= 4 )  {  str.Format(_T("Microsoft Windows NT "));  }  // Test for specific product on Windows NT 4.0 SP6 and later.  if( bOsVersionInfoEx )  {  //将Service Pack 版本保存  strServiceVersion.Format(_T("Service Pack %d"),osvi.wServicePackMajor);  // Test for the workstation type.  if ( osvi.wProductType == VER_NT_WORKSTATION &&  si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)  {  if( osvi.dwMajorVersion == 4 )  str = str + _T("Workstation 4.0");  else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )  str = str + _T("Home Edition");  else str = str + _T( "Professional");  }  // Test for the server type.  else if ( osvi.wProductType == VER_NT_SERVER ||   osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )  {  if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)  {  if ( si.wProcessorArchitecture ==  PROCESSOR_ARCHITECTURE_IA64 )  {  if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  str = str + _T("Datacenter Edition for Itanium-based Systems");  else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  str = str + _T("Enterprise Edition for Itanium-based Systems");  }  else if ( si.wProcessorArchitecture ==  PROCESSOR_ARCHITECTURE_AMD64 )  {  if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  str = str + _T( "Datacenter x64 Edition ");  else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  str = str + _T( "Enterprise x64 Edition ");  else str = str + _T( "Standard x64 Edition ");  }  else  {  if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  str = str + _T( "Datacenter Edition ");  else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  str = str + _T( "Enterprise Edition ");  else if ( osvi.wSuiteMask & VER_SUITE_BLADE )  str = str + _T( "Web Edition ");  else str = str + _T( "Standard Edition ");  }  }  else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)  {  if( osvi.wSuiteMask & VER_SUITE_DATACENTER )  str = str + _T("Datacenter Server ");  else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  str = str + _T( "Advanced Server ");  else str = str + _T( "Server ");  }  else  // Windows NT 4.0   {  if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )  str = str + _T ("Server 4.0, Enterprise Edition ");  else str = str + _T ( "Server 4.0 " );  }  }  }  // Test for specific product on Windows NT 4.0 SP5 and earlier  else    {  HKEY hKey;  TCHAR szProductType[256];  DWORD dwBufLen=256*sizeof(TCHAR);  LONG lRet;  lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,  _T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hKey );  if( lRet != ERROR_SUCCESS )  strOSVersion = str;  return;  lRet = RegQueryValueEx( hKey, TEXT("ProductType"),  NULL, NULL, (LPBYTE) szProductType, &dwBufLen);  RegCloseKey( hKey );  if( (lRet != ERROR_SUCCESS) ||  (dwBufLen > 256*sizeof(TCHAR)) )  strOSVersion = str;  return;  if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 )  str = str + _T( "Workstation ");  if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 )  str = str + _T( "Server " );  if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 )  str = str + _T( "Advanced Server ");  str.Format(_T( "%d.%d "), osvi.dwMajorVersion, osvi.dwMinorVersion );  }  // Display service pack (if any) and build number.  if( osvi.dwMajorVersion == 4 &&   lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 )  {   HKEY hKey;  LONG lRet;  // Test for SP6 versus SP6a.  lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,  _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey );  if( lRet == ERROR_SUCCESS )  str.Format(_T( "Service Pack 6a (Build %d)\n"),   osvi.dwBuildNumber & 0xFFFF );           else // Windows NT 4.0 prior to SP6a  {  _tprintf( TEXT("%s (Build %d)\n"),  osvi.szCSDVersion,  osvi.dwBuildNumber & 0xFFFF);  }  RegCloseKey( hKey );  }  else // not Windows NT 4.0   {  _tprintf( TEXT("%s (Build %d)\n"),  osvi.szCSDVersion,  osvi.dwBuildNumber & 0xFFFF);  }  break;  // Test for the Windows Me/98/95.  case VER_PLATFORM_WIN32_WINDOWS:  if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)  {  str.Format(_T("Microsoft Windows 95 "));  if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')  str = str + _T("OSR2 ");  }   if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)  {  str.Format(_T("Microsoft Windows 98 "));  if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')  str = str + _T("SE ");  }   if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)  {  str.Format(_T("Microsoft Windows Millennium Edition\n"));  }   break;  case VER_PLATFORM_WIN32s:  str.Format(_T("Microsoft Win32s\n"));  break;  default:  break;  }  strOSVersion = str;  
}  BOOL GetSysInfo::IsWow64()   
{   typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);   LPFN_ISWOW64PROCESS fnIsWow64Process;   BOOL bIsWow64 = FALSE;   fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(_T("kernel32")),"IsWow64Process");   if (NULL != fnIsWow64Process)   {   fnIsWow64Process(GetCurrentProcess(),&bIsWow64);  }   return bIsWow64;   
}   void GetSysInfo::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[50] = {0};  CHAR chCPUName[50] = {0};  DWORD dwSize=50;   //获取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,0,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;  }  //GetDisplayName()  
}  void  GetSysInfo::GetMemoryInfo(CString &dwTotalPhys,CString &dwTotalVirtual)   
{   //   TODO:     Add   extra   initialization   here   MEMORYSTATUS   Mem;   //   get   the   memory   status   GlobalMemoryStatus(&Mem);   DWORD dwSize = (DWORD)Mem.dwTotalPhys/(1024*1024);   DWORD dwVirtSize = (DWORD)Mem.dwTotalVirtual/(1024*1024);  dwTotalPhys.Format(_T("物理内存:%ld MB"),dwSize);   dwTotalVirtual.Format(_T("虚拟内存:%ld MB"),dwVirtSize);  
}  int GetSysInfo::GetInterFaceCount()  
{  /*CGetNetData pNet; DWORD pCount = pNet.GetNetworkInterfacesCount(); return pCount;*/  try  {  
#define DEFAULT_BUFFER_SIZE 40960L  unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE);  DWORD type;  DWORD size = DEFAULT_BUFFER_SIZE;  DWORD ret;  char s_key[4096];  sprintf_s(s_key , 4096 , "510");  //RegQueryValueEx的固定调用格式          CString str(s_key);  //如果RegQueryValueEx函数执行失败则进入循环  while((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, str, 0, &type, data, &size)) != ERROR_SUCCESS)  {  Sleep(10);  //如果RegQueryValueEx的返回值为ERROR_MORE_DATA(申请的内存区data太小,不能容纳RegQueryValueEx返回的数据)  if(ret == ERROR_MORE_DATA)   {  Sleep(10);  size += DEFAULT_BUFFER_SIZE;  data = (unsigned char*) realloc(data, size);//重新分配足够大的内存  ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, str, 0, &type, data, &size);//重新执行RegQueryValueEx函数  }   //如果RegQueryValueEx返回值仍旧未成功则函数返回.....(注意内存泄露“free函数”~~~)。  //这个if保证了这个while只能进入一次~~~避免死循环  if(ret != ERROR_SUCCESS)  {  if (NULL != data)  {  free(data);  data = NULL;  }  return 0;//0个接口  }  }  //函数执行成功之后就是对返回的data内存中数据的解析了,这个建议去查看MSDN有关RegQueryValueEx函数参数数据结构的说明  //得到数据块       PERF_DATA_BLOCK  *dataBlockPtr = (PERF_DATA_BLOCK *)data;  //得到第一个对象  PERF_OBJECT_TYPE *objectPtr = (PERF_OBJECT_TYPE *) ((BYTE *)dataBlockPtr + dataBlockPtr->HeaderLength);  for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++)   {  char nameBuffer[255] = {0};  if(objectPtr->ObjectNameTitleIndex == 510)   {  DWORD processIdOffset = ULONG_MAX;  PERF_COUNTER_DEFINITION *counterPtr =(PERF_COUNTER_DEFINITION *) ((BYTE *)objectPtr + objectPtr->HeaderLength);  for(int b=0 ; b<(int)objectPtr->NumCounters ; b++)   {  if(counterPtr->CounterNameTitleIndex == 520)  processIdOffset = counterPtr->CounterOffset;  counterPtr =(PERF_COUNTER_DEFINITION *) ((BYTE *) counterPtr + counterPtr->ByteLength);  }  if(processIdOffset == ULONG_MAX) {  if(data != NULL)  {  free(data);  data = NULL;  }  return 0;  }  PERF_INSTANCE_DEFINITION *instancePtr =(PERF_INSTANCE_DEFINITION *)  ((BYTE *) objectPtr + objectPtr->DefinitionLength);  for(int b=0 ; b<objectPtr->NumInstances ; b++)   {  wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);  PERF_COUNTER_BLOCK *counterBlockPtr = (PERF_COUNTER_BLOCK *) ((BYTE *)instancePtr + instancePtr->ByteLength);  char pName[256] = {0};  WideCharToMultiByte(CP_ACP, 0, namePtr, -1, pName, sizeof(nameBuffer), 0, 0);  DWORD bandwith = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));                DWORD tottraff = 0;  Interfaces.AddTail(CString(pName)); //各网卡的名称  Bandwidths.AddTail(bandwith);       //带宽  TotalTraffics.AddTail(tottraff);    // 流量初始化为0  PERF_COUNTER_BLOCK  *pCtrBlk = (PERF_COUNTER_BLOCK *) ((BYTE *)instancePtr + instancePtr->ByteLength);  instancePtr = (PERF_INSTANCE_DEFINITION *) ((BYTE *)instancePtr + instancePtr->ByteLength + pCtrBlk->ByteLength);  }  }  objectPtr = (PERF_OBJECT_TYPE *) ((BYTE *)objectPtr + objectPtr->TotalByteLength);  }  if(data != NULL)  {  free(data);  data = NULL;  }  }  catch(...)  {  return 0;  }  return Interfaces.GetCount();  
}  void GetSysInfo::GetInterFaceName(CString &InterfaceName,int pNum)  
{  /*CGetNetData pNet; pNet.GetNetworkInterfaceName(&InterfaceName,pNum);*/  POSITION pos = Interfaces.FindIndex(pNum);  if(pos==NULL)  return ;  InterfaceName = Interfaces.GetAt(pos);  pos = Bandwidths.FindIndex(pNum);  if (pos == NULL)  return;  DWORD dwBandwidth = Bandwidths.GetAt(pos);  CString str;  str.Format(_T("%d"),dwBandwidth);  InterfaceName = InterfaceName + str;  
}  void GetSysInfo::GetDiskInfo(DWORD &dwNum,CString chDriveInfo[])  
{  DWORD DiskCount = 0;  //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。  DWORD DiskInfo = GetLogicalDrives();  //通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。  while(DiskInfo)  {  //通过位运算的逻辑与操作,判断是否为1  Sleep(10);  if(DiskInfo&1)  {  DiskCount++;  }  DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。*/  }  if (dwNum < DiskCount)  {  return;//实际的磁盘数目大于dwNum  }  dwNum = DiskCount;//将磁盘分区数量保存  //-------------------------------------------------------------------//  //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度  int DSLength = GetLogicalDriveStrings(0,NULL);  WCHAR* DStr = new WCHAR[DSLength];  //CHAR* DStr = new WCHAR[DSLength];  //CHAR* DStr = new CHAR[DSLength];  memset(DStr,0,DSLength);  //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。  GetLogicalDriveStrings(DSLength,DStr);  int DType;  int si=0;  BOOL fResult;  unsigned _int64 i64FreeBytesToCaller;  unsigned _int64 i64TotalBytes;  unsigned _int64 i64FreeBytes;  //读取各驱动器信息,由于DStr内部数据格式是A:\NULLB:\NULLC:\NULL,所以DSLength/4可以获得具体大循环范围  for(int i=0;i<DSLength/4;++i)  {  Sleep(10);  CString strdriver = DStr+i*4;  CString strTmp,strTotalBytes,strFreeBytes;  DType = GetDriveType(strdriver);//GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录  switch (DType)  {  case DRIVE_FIXED:  {  strTmp.Format(_T("本地磁盘"));  }  break;  case DRIVE_CDROM:  {  strTmp.Format(_T("DVD驱动器"));  }  break;  case DRIVE_REMOVABLE:  {  strTmp.Format(_T("可移动磁盘"));  }  break;  case DRIVE_REMOTE:  {  strTmp.Format(_T("网络磁盘"));  }  break;  case DRIVE_RAMDISK:  {  strTmp.Format(_T("虚拟RAM磁盘"));  }  break;  case DRIVE_UNKNOWN:  {  strTmp.Format(_T("虚拟RAM未知设备"));  }  break;  default:  strTmp.Format(_T("未知设备"));  break;  }  //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据  fResult = GetDiskFreeSpaceEx (strdriver,  (PULARGE_INTEGER)&i64FreeBytesToCaller,  (PULARGE_INTEGER)&i64TotalBytes,  (PULARGE_INTEGER)&i64FreeBytes);  if(fResult)  {  strTotalBytes.Format(_T("磁盘总容量%fMB"),(float)i64TotalBytes/1024/1024);  strFreeBytes.Format(_T("磁盘剩余空间%fMB"),(float)i64FreeBytesToCaller/1024/1024);  }  else  {  strTotalBytes.Format(_T(""));  strFreeBytes.Format(_T(""));  }  chDriveInfo[i] = strTmp + _T("(") + strdriver + _T("):") + strTotalBytes + strFreeBytes;  si+=4;  }  
}  void GetSysInfo::GetDisplayCardInfo(DWORD &dwNum,CString chCardName[])  
{  HKEY keyServ;  HKEY keyEnum;  HKEY key;  HKEY key2;  LONG lResult;//LONG型变量-保存函数返回值  //查询"SYSTEM\\CurrentControlSet\\Services"下的所有子键保存到keyServ  lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Services"),0,KEY_READ,&keyServ);  if (ERROR_SUCCESS != lResult)  return;  //查询"SYSTEM\\CurrentControlSet\\Enum"下的所有子键保存到keyEnum  lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Enum"),0,KEY_READ,&keyEnum);  if (ERROR_SUCCESS != lResult)  return;  int i = 0,count = 0;  DWORD size = 0,type = 0;  for (;;++i)  {  Sleep(5);  size = 512;  TCHAR name[512] = {0};//保存keyServ下各子项的字段名称  //逐个枚举keyServ下的各子项字段保存到name中  lResult = RegEnumKeyEx(keyServ,i,name,&size,NULL,NULL,NULL,NULL);  //要读取的子项不存在,即keyServ的子项全部遍历完时跳出循环  if(lResult == ERROR_NO_MORE_ITEMS)  break;  //打开keyServ的子项字段为name所标识的字段的值保存到key  lResult = RegOpenKeyEx(keyServ,name,0,KEY_READ,&key);  if (lResult != ERROR_SUCCESS)  {  RegCloseKey(keyServ);  return;  }  size = 512;  //查询key下的字段为Group的子键字段名保存到name  lResult = RegQueryValueEx(key,TEXT("Group"),0,&type,(LPBYTE)name,&size);  if(lResult == ERROR_FILE_NOT_FOUND)  {  //?键不存在  RegCloseKey(key);  continue;  };  //如果查询到的name不是Video则说明该键不是显卡驱动项  if(_tcscmp(TEXT("Video"),name)!=0)  {  RegCloseKey(key);  continue;     //返回for循环  };  //如果程序继续往下执行的话说明已经查到了有关显卡的信息,所以在下面的代码执行完之后要break第一个for循环,函数返回  lResult = RegOpenKeyEx(key,TEXT("Enum"),0,KEY_READ,&key2);  RegCloseKey(key);  key = key2;  size = sizeof(count);  lResult = RegQueryValueEx(key,TEXT("Count"),0,&type,(LPBYTE)&count,&size);//查询Count字段(显卡数目)  dwNum = count;//保存显卡数目  for(int j=0;j <count;++j)  {  TCHAR sz[512] = {0};  TCHAR name[64] = {0};  wsprintf(name,TEXT("%d"),j);  size = sizeof(sz);  lResult  = RegQueryValueEx(key,name,0,&type,(LPBYTE)sz,&size);  lResult = RegOpenKeyEx(keyEnum,sz,0,KEY_READ,&key2);  if (ERROR_SUCCESS)  {  RegCloseKey(keyEnum);  return;  }  size = sizeof(sz);  lResult = RegQueryValueEx(key2,TEXT("FriendlyName"),0,&type,(LPBYTE)sz,&size);  if(lResult == ERROR_FILE_NOT_FOUND)  {  size = sizeof(sz);  lResult = RegQueryValueEx(key2,TEXT("DeviceDesc"),0,&type,(LPBYTE)sz,&size);  chCardName[j] = sz;//保存显卡名称  };  RegCloseKey(key2);  key2 = NULL;  };  RegCloseKey(key);  key = NULL;  break;  }  
}


相关文章:

cmake 注意事项

1. add_subdirectory()调用 CMake将在每次add_subdirectory()调用时创建一个新的变量作用域,因此这个参数最好的用法是放在cmaklists的最后使用&#xff0c;这样的话创建的新的变量的作用范围与内存的变化就不会影响到后面的变量的使用。 查看并打印在cmake里面定义的宏在&am…

Jmeter 使用自定义变量

有些情况下比如发起测试时URL的主机名和端口需要在采样器中出现多次&#xff0c;这样就有个问题&#xff0c;当测试的主机更改时&#xff0c; 我们需要修改主机名称&#xff0c;这时就需要修改多个地方&#xff0c;如果多的情况会有遗漏。如果我们在配置脚本的时候&#xff0c;…

Kubernetes1.5源码分析(二) apiServer之资源注册

源码版本 Kubernetes v1.5.0 简介 k8s里面有各种资源&#xff0c;如Pod、Service、RC、namespaces等资源&#xff0c;用户操作的其实也就是这一大堆资源。但这些资源并不是杂乱无章的&#xff0c;使用了GroupVersion的方式组织在一起。每一种资源都属于一个Group&#xff0c;而…

opencv3 视频稳像

OpneCV3.x中提供了专门应用于视频稳像技术的模块&#xff0c;该模块包含一系列用于全局运动图像估计的函数和类。结构体videostab::RansacParams实现了RANSAC算法&#xff0c;这个算法用来实现连续帧间的运动估计。videostab::MotionEstimatorBase是基类中所有全局运动估计方法…

perf+火焰图 = 性能分析利器

perf 1. perf安装 sudo apt install linux-tools-common检查是否安装好 perf如果出现 You may need to install the following packages for this specific kernel:推荐安装可以按照提示将推荐安装包全部安装好 sudo apt-get install linux-tools-对应版本-generic linux-c…

3- MySQL数据类型

MySQL表字段类型 MySQL数据表的表示一个二维表&#xff0c;由一个或多个数据列构成。 每个数据列都有它的特定类型&#xff0c;该类型决定了MySQL如何看待该列数据&#xff0c;并且约束列存放相应类型的数据。 MySQL中的列表有三种&#xff1a;数值类&#xff0c;字符串类和日期…

AddressSanitizer+cmake

1. AddressSanitizercmake(Linux) 编译指令&#xff1a; CXXFLAGS通常需要加上 -fsanitizeaddress -fno-omit-frame-pointer #打印函数调用路径 -fsanitize-recoveraddress #AddressSanitizer遇到错误时能够继续-fsanitizeaddress-fno-omit-frame-pointer-fsanitize-rec…

vibe前景提取改进算法

// improveVibeAlgorithm.h #ifndef IMPROVED_VIBE_ALGORITHM_H #define IMPROVED_VIBE_ALGORITHM_H#include <opencv2/opencv.hpp> using namespace std;#define WINSIZE 5 // Vibe改进算法, Barnich, Olivier & Droogenbroeck, Marc. (2009). // ViBE: A powerfu…

npm-debug.log文件出现原因

项目主目录下总是会出现这个文件&#xff0c;而且不止一个&#xff0c;原因是npm i 的时候&#xff0c;如果报错&#xff0c;就会增加一个此文件来显示报错信息&#xff0c;npm install的时候则不会出现。转载于:https://www.cnblogs.com/liuna/p/6558006.html

AutoFac Ioc依赖注入容器

本文原著&#xff1a;牛毅 原文路径 http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 理解IOC容器请看下图&#xff1a; 没有使用IOC容器的情况下: 使用IOC容器的情况下&#xff1a; 去掉IOC容器的情况后&#xff1a; IOC容器又像一个插座&#xff0c;将电输送…

Linux安装App记录

Ubuntu18.04安装微信

windows socket编程入门示例3

// Lock.h #ifndef _Lock_H #define _Lock_H #include <windows.h>class CriticalSection { private:CRITICAL_SECTION g_cs; //临界区 public:CriticalSection();~CriticalSection();void Lock();void UnLock(); }; #endif// Lock.cpp #include "Lock.h"…

游戏开发:js实现简单的板球游戏

js实现简单的板球游戏大家好&#xff0c;本次我们来使用js来实现一个简单的板球游戏。截图如下&#xff1a;首先&#xff0c;设计页面代码&#xff0c;页面代码很简单&#xff0c;因为整个几乎是使用js编写的&#xff0c;页面几乎没有代码&#xff0c;如下&#xff1a;<!DOC…

SLAM精度测评——EVO进阶

1. 基本概念 1.1 Umeyama算法 ATE&#xff1a; evo_ape tum state_groundtruth_estimate0/data.tum orb2/CameraTrajectory.txt -r trans_part -va --plot --plot_mode xy --save_results /home/sun/evo/v1_01_easy/orb2/ate.zip RPE&#xff1a; evo_rpe tum state_groun…

python读取图片并且显示

使用python-opencv读取图片&#xff0c;利用opencv或matplotlib显示图片。 # -*- coding: utf-8 -*-import numpy as np from matplotlib import pyplot as plt #import urllib import cv2def load_image1(file):# Load an color image in grayscaleimg cv2.imread(file,0)cv…

shiro认证

shiro权限认证&#xff1a; 具体的认证流程是这样的&#xff1a; 一般流程&#xff1a; 通过.ini的文件来初始化工厂&#xff0c;.ini的文件的好处是可以创建多个组&#xff0c;而.properties的文件只能创建一组。 系统默认有shiro.ini的文件&#xff0c;但是一般我们是自定义数…

小猿圈Linux基础面试题,看看你能答对几道?

最近身边的很多朋友都在学习linux&#xff0c;从最开始的安装软件都需要百度一天的他们&#xff0c;现在已经成长为了&#xff0c;不需要百度就可以把自己弄懵圈的了&#xff0c;接下来的几天小猿圈linux老师会为大家准备一些实用的linux技巧分析给大家&#xff0c;希望对你有所…

ORB-SLAM2 论文翻译

https://ug98gs7tbw.feishu.cn/docs/doccnKKOWAjkKv7AzAiEvbnM3Tf

mxnet教程1

import mxnet as mx #%matplotlib inline import os import subprocess import numpy as np import matplotlib.pyplot as plt import tarfileimport warnings warnings.filterwarnings("ignore", categoryDeprecationWarning)# 从内存中读取数据 def test1():data …

番外:Spring MVC环境搭建和Mybatis配置避坑篇

2019独角兽企业重金招聘Python工程师标准>>> web.xml引入对spring mvc的支持&#xff1b; spring-mvc配置spring-mvc&#xff1b; spring-mybatis配置mybatis支持&#xff0c;并指名mapper文件的位置&#xff1b; mybaits-config配置mybatis&#xff1b; jdbc.prope…

50个云终端只需一台服务器是怎么一回事

看到这个标题也许有人会说50个云终端只需要一台服务器这应该是不可能的吧&#xff0c;即使是真的那这个服务器的配置和价格应该也要非常高的吧。但是如果有人和你说50个云终端只需要一台中等配置和价格的服务器就可以的呢。而且这50个用户桌面都可以正常的使用不会出现卡顿等现…

SLAM学习,小白入门到殿堂级大牛资料整理

总结一下我接触过的SLAM算法吧,主要集中在visual slam: 特征法: ORB SLAM https://github.com/raulmur/ORB_SLAM2优势: 在静态环境下定位准确,稳定, 单目和双目版本都可以达到实时(高于10frames/s)。代码可读性强,易扩展, 网上也有实现和imu融合的版本。 劣势:建的地图…

python解析json

“data.json”文件内容如下&#xff1a; {"id":"1220562","alt":"http:\/\/book.douban.com\/book\/1220562","rating":{"max":10, "average":"7.0", "numRaters":282, "min…

8.改进应用程序

2019独角兽企业重金招聘Python工程师标准>>> ##8.1数字格式设置&#xff08;storyboard&#xff09; ##8.1.2可选类型拆封 import Cocoa extension Double{var dollars : String{let formatter : NumberFormatter NumberFormatter()//NSNumberFormatter弃用var re…

小猿圈Linux学习-Linux种搜索的命令

做Linux工程师的每天都不能少的工作就是搜索文件&#xff0c;这是他们的日常活动&#xff0c;很繁琐很枯燥&#xff0c;所以我们就需要知道一些搜索的命令&#xff0c;这些命令更高效更快捷&#xff0c;今天小猿圈就给大家分享4个可以搜索的Linux命令。。 方法 1&#xff1a;使…

SURF与SIFT比较分析

opencv3.2 SURF实现特征点匹配 opencv3.2中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher这三个的使用方法已经和原先2.4版本前不一样了。 使用方法示例如下&#xff1a; Ptr<SURF> detector SURF::create(minHessian);detector->detect(img_1…

python文件和目录

# -*- coding: utf-8 -*-import osdef printFile(rootDir):allFiles os.listdir(rootDir) #列出文件夹下所有文件和目录for i in range(0, len(allFiles)):# print(rootDir allFiles[i])path os.path.join(rootDir, allFiles[i])if not os.path.isfile(path):print(path, &q…

你不怕他离职吗?

图片来自“wikiart” 这是我同事在晚上11点多跟我聊微信时问起的一个问题&#xff0c;我觉得这个问题还是挺有代表性的&#xff0c;所以我还是决定就这个问题展开聊聊我对这句话的看法。 我同事之所以这么说&#xff0c;是因为他的组员&#xff0c;也就是问题中的那个他&#x…

tensorflow 1

import tensorflow as tf import numpy as np import matplotlib.pylab as pltdef tfDemo1():#create datax_data np.random.rand(100).astype(np.float32)y_data x_data * 0.1 0.3#create tensorflow structureWeightstf.Variable(tf.random_uniform([1],-1.0,1.0)) #一维&…

SLAM资源整理

资源整理 浙大3D Group VINS orbslam2 orbslam2 video study https://www.bilibili.com/video/BV1bK4y197kB/?spm_id_fromautoNext orbslam2 csdn https://blog.csdn.net/ncepu_chen/category_9874746.html https://www.zhihu.com/column/c_1114864226103037952 https:…