获取硬件信息

std::list<string> g_listVideoCard;  
#define   CHECK_ERROR(apiname)  if(error   !=   ERROR_SUCCESS){api=TEXT(apiname);goto   failed;}  
int GetVideoCardInfo()
{  
 HKEY         keyServ   =   NULL;  
 HKEY         keyEnum   =   NULL;  
 HKEY         key           =   NULL;  
 HKEY         key2         =   NULL;  
 DWORD       error       =   0;  
 LPCTSTR   api           =   NULL;  
 DWORD       type,   count,   size,   i,   iServ;  


 setlocale   (LC_ALL,   ".ACP");  

 error   =   RegOpenKeyEx   (HKEY_LOCAL_MACHINE,   TEXT   ("SYSTEM//CurrentControlSet//Services"),    
  0,   KEY_READ,   &keyServ);  

 CHECK_ERROR   ("RegOpenKeyEx");  

 error   =   RegOpenKeyEx   (HKEY_LOCAL_MACHINE,    
  TEXT   ("SYSTEM//CurrentControlSet//Enum"),    
  0,   KEY_READ,   &keyEnum);  

 CHECK_ERROR   ("RegOpenKeyEx");  

 i   =   0;  
 for   (iServ=0;;++iServ)  
 {  
  TCHAR   name   [0x200];  
  size   =   0x200;  
  error   =   RegEnumKeyEx   (keyServ,   iServ,   name,   &size,    
   NULL,   NULL,   NULL,   NULL);  

  if   (error   ==   ERROR_NO_MORE_ITEMS)  
   break;  

  CHECK_ERROR   ("RegEnumKeyEx");  

  error   =   RegOpenKeyEx   (keyServ,   name,   0,   KEY_READ,   &key);  

  CHECK_ERROR   ("RegOpenKeyEx");  

  size   =   0x200;  
  error   =   RegQueryValueEx   (key,   TEXT   ("Group"),     0,   &type,   (LPBYTE)name,   &size);  

  if   (error   ==   ERROR_FILE_NOT_FOUND)  
  {       //     键不存在  
   RegCloseKey   (key);  
   continue;  
  };  

  CHECK_ERROR   ("RegQueryValueEx");  

  if   (_tcscmp   (TEXT   ("Video"),   name)   !=   0)  
  {       //     不是显卡的内核驱动  
   RegCloseKey   (key);  
   continue;  
  };  

  error   =   RegOpenKeyEx   (key,   TEXT   ("Enum"),     0,   KEY_READ,   &key2);  

  CHECK_ERROR   ("RegOpenKeyEx");  
  RegCloseKey   (key);  
  key   =   key2;  

  size   =   sizeof   (count);  
  error   =   RegQueryValueEx   (key,   TEXT   ("Count"),     0,   &type,   (LPBYTE)&count,   &size);  

  CHECK_ERROR   ("RegQueryValueEx");  

  for   (i=0;i<count;++i)  
  {  
   TCHAR   sz   [0x200];  
   TCHAR   name   [0x40];  

   wsprintf   (name,   TEXT   ("%d"),   i);  
   size   =   sizeof   (sz);  
   error   =   RegQueryValueEx   (key,   name,    
    0,   &type,   (LPBYTE)sz,   &size);  

   CHECK_ERROR   ("RegQueryValueEx");  

   error   =   RegOpenKeyEx   (keyEnum,   sz,    
    0,   KEY_READ,   &key2);  

   CHECK_ERROR   ("RegOpenKeyEx");  

   size   =   sizeof   (sz);  
   error   =   RegQueryValueEx   (key2,   TEXT   ("FriendlyName"),     0,   &type,   (LPBYTE)sz,   &size);  

   if   (error   ==   ERROR_FILE_NOT_FOUND)  
   {  
    size   =   sizeof   (sz);  
    error   =   RegQueryValueEx   (key2,   TEXT   ("DeviceDesc"),     0,   &type,   (LPBYTE)sz,   &size);  
   };  
   CHECK_ERROR   ("RegQueryValueEx");  

   g_listVideoCard.push_back   (sz);  
   RegCloseKey   (key2);  
   key2   =   NULL;  
  };  
  RegCloseKey   (key);  
  key   =   NULL;  
 };  
 RegCloseKey   (keyEnum);  
 RegCloseKey   (keyServ);  
 return   0;  

failed:  
 if   (keyServ)  
  RegCloseKey   (keyServ);  
 if   (keyEnum)  
  RegCloseKey   (keyEnum);  
 if   (key)  
  RegCloseKey   (key);  
 if   (key2)  
  RegCloseKey   (key2);  
 
 return   error;  
};

/*
  //获得C盘可用空间
  DWORD sector,byte,cluster,free;
  long int freespace,totalspace;
  GetDiskFreeSpace(“C:”,&sector,&byte,&free,&cluster); //获得返回参数
  totalspace=int(cluster)*int(byte)*int(sector)/1024/1024; //计算总容量
  freespace=int(free)*int(byte)*int(sector)/1024/1024; //计算可用空间
  Memo1→Lines→Add(“C盘总空间(Mb):”+String(totalspace));
  Memo1→Lines→Add(“C盘可用空间(Mb):”+String(freespace));
*/

//---------------------------------------------------------------------------
// 获取硬件消息
#include   <ddraw.h>  
#pragma comment(lib, "ddraw.lib")
LPDIRECTDRAW7   lpDD;
//---------------------------------------------------------------------------
void GetHwInformation(char* strResult)
{
 HKEY hKey;
 DWORD dwMhz,dwSize;
 char strDx[256], strCpu[256],strVendor[256],strIdentifier[256],stmp[1024];

 strcpy(strResult,"// 机器配置:/n");
 // 操作系统版本号:
 OSVERSIONINFO osvi;
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 GetVersionEx(&osvi);
 sprintf(stmp,"OS:/n  %u,%u,%u,%u/r/n",osvi.dwMajorVersion,osvi.dwMinorVersion,osvi.dwBuildNumber,osvi.dwPlatformId);
 strcat(strResult,stmp);

 // Dx版本号:
 RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE//MICROSOFT//DirectX",0,KEY_QUERY_VALUE,&hKey);
 dwSize = sizeof(strDx);
 RegQueryValueEx(hKey,"Version",0,0,(LPBYTE)strDx,&dwSize);
 RegCloseKey( hKey );

 sprintf(stmp,"DX:/n  %s/n",strDx);
 strcat(strResult,stmp);

 // 检测显卡:
 GetVideoCardInfo();
 std::list<string>::iterator it, end;  
 it  = g_listVideoCard.begin();  
 end = g_listVideoCard.end();  
 sprintf(stmp,"VideoCard:/n");
 strcat(strResult,stmp);
 for(int i=0;it!=end;++it)  
 {  
  sprintf(stmp,"  %s/n",it->c_str());
  strcat(strResult,stmp);
 }

 // 检测显示器
/*
 //::GetDeviceCaps();
 int tcs;
  long int bpp,cp,tc;
  Memo1→Lines→Add (“当前分辨率为:”+String(Screen→Width)+“*”+
String(Screen→Height));
  bpp=GetDeviceCaps(Form1→Canvas→Handle ,BITSPIXEL);
  tcs=pow(2,bpp); //计算色彩的梯度数
  cp= GetDeviceCaps(Form1→Canvas→Handle,PLANES);
  tc= pow(tcs,cp); //计算色深
  Memo1→Lines→Add(“当前色深为:”+String(tc));
*/

 // 得到cpu数据:
 //SYSTEM_INFO systeminfo; GetSystemInfo (&systeminfo);
 RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE//DESCRIPTION//System//CentralProcessor//0",0,KEY_QUERY_VALUE,&hKey);
 dwMhz = 0;
 dwSize = sizeof(dwMhz);
 RegQueryValueEx(hKey,"~MHz",0,0,(LPBYTE)&dwMhz,&dwSize);

 strcpy(strCpu,"");
 dwSize = sizeof(strCpu);
 RegQueryValueEx(hKey,"ProcessorNameString",0,0,(LPBYTE)strCpu,&dwSize);

 strcpy(strVendor,"");
 dwSize = sizeof(strVendor);
 RegQueryValueEx(hKey,"VendorIdentifier",0,0,(LPBYTE)strVendor,&dwSize);

 strcpy(strIdentifier,"");
 dwSize = sizeof(strIdentifier);
 RegQueryValueEx(hKey,"Identifier",0,0,(LPBYTE)strIdentifier,&dwSize);        
 RegCloseKey( hKey );

 //sprintf(stmp,"CPU: %dMHz,%s,%s/r/n",(int)dwMhz,strVendor,strCpu);
 sprintf(stmp,"CPU:/n  %s/n",strCpu);
 strcat(strResult,stmp);
 sprintf(stmp,"VendorIdentifier:/n  %s/n",strVendor);
 strcat(strResult,stmp);
 sprintf(stmp,"Identifier:/n  %s/n",strIdentifier);
 strcat(strResult,stmp);

 // 得到内存数据:
 MEMORYSTATUS ms;
 GlobalMemoryStatus(&ms);
 sprintf(stmp,"mem(T/F):/n  MemoryLoad:%d,/n  TotalPhys:%dK, AvailPhys:%dK,/n  AvailPageFile:%dK, TotalPageFile:%dK,/n  AvailVirtual:%dK,TotalVirtual:%dK/r/n",
  ms.dwMemoryLoad,ms.dwTotalPhys/1024,ms.dwAvailPhys/1024,ms.dwAvailPageFile/1024,ms.dwTotalPageFile/1024,ms.dwAvailVirtual/1024,ms.dwTotalVirtual/1024);
 strcat(strResult,stmp);

 // 得到显存数据:
 //
 //创建DirectDraw对象  
 //DirectDrawCreate(NULL,   &lpDD,   NULL);  
 DirectDrawCreateEx(NULL, (VOID**)&lpDD, IID_IDirectDraw7, NULL);
 DDSCAPS2 ddsCaps;
 ZeroMemory(&ddsCaps, sizeof(ddsCaps));

 ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
 DWORD dwUsedVRAM = 0;
 DWORD dwTotal=0;
 DWORD dwFree=0;

 // lp_DD points to the IDirectDraw object
 HRESULT hr = lpDD->GetAvailableVidMem(&ddsCaps, &dwTotal, &dwFree);

 // dwUsedVRAM holds the number of bytes of VRAM used
 dwUsedVRAM = dwTotal-dwFree;
 lpDD->Release();
 //

 sprintf(stmp,"VideoMemory:/n  Total:%fM,Using:%fM,Free:%fM,/n",(float)dwTotal/(float)1000000,(float)dwUsedVRAM/(float)1000000,(float)dwFree/(float)1000000);
 strcat(strResult,stmp);

//    IDirect3DX* d3d = Direct3DCreateX(D3D_SDK_VERSION);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值