5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  硬件/系统

请问用什么方法获得机器的详细硬件信息?

楼主miaoshu(智障大师)2002-07-11 21:56:56 在 VC/MFC / 硬件/系统 提问

注册表的信息实在太少,如何才能得到系统所有硬件的详细描述呢?  
   
  小弟一点头绪都没有,望高手指点! 问题点数:100、回复次数:18Top

1 楼louifox(兰陵笑笑生)回复于 2002-07-11 22:46:55 得分 0

vc里找找控件Top

2 楼nevergrief(孤独骑士)回复于 2002-07-12 03:16:10 得分 10

//   例64   检测硬件设备  
  class   CHardwareInfoDlg   :   public   CDialog  
  {  
  public:  
  bool   GetProcessorInfo();  
  bool   GetMouseInfo();  
  void   GetMemory();  
  MEMORYSTATUS   mem;  
  }  
  bool   CHardwareInfoDlg::GetProcessorInfo()  
  {  
  SYSTEM_INFO   sysInfo;  
  char   str   [MAX_PATH];  
  //   Get   the   hardware   information  
  GetSystemInfo(&sysInfo);  
  //   Lets   check   the   processor   type   first  
  if   (sysInfo.dwProcessorType     ==   PROCESSOR_INTEL_386)   {  
  m_stProcessorType   =   _T   ("Intel   386");  
  }  
  else   if   (sysInfo.dwProcessorType     ==   PROCESSOR_INTEL_486)   {  
  m_stProcessorType   =   _T   ("Intel   486");  
  }  
  else   if   (sysInfo.dwProcessorType     ==   PROCESSOR_INTEL_PENTIUM)   {  
  m_stProcessorType   =   _T   ("Intel   Pentium");  
  }  
  else   if   (sysInfo.dwProcessorType     ==   PROCESSOR_MIPS_R4000)   {  
  //   only   for   NT  
  m_stProcessorType   =   _T   ("MIPS");  
  }  
  else   if   (sysInfo.dwProcessorType     ==   PROCESSOR_ALPHA_21064)   {  
  //   only   for   NT  
  m_stProcessorType   =   _T   ("Alpha");  
  }  
  else   {  
  m_stProcessorType   =   _T   ("Unknown");  
  }  
  //   check   number   of   processors  
  itoa   (sysInfo.dwNumberOfProcessors   ,   str,   10);  
  m_stNumProcessors   =   CString   (str);  
  //   Check   the   architecture   type   and   processor   level  
  //   Windows   95   doesn't   use   processor   level  
  if   (sysInfo.wProcessorArchitecture   ==   PROCESSOR_ARCHITECTURE_INTEL)   {  
  m_stArchitecture   =   _T   ("Pentium");  
  switch   (sysInfo.wProcessorLevel)   {  
  case   3:  
  m_stProcessorLevel   =   _T   ("Intel   80386");  
  break;  
  case   4:  
  m_stProcessorLevel   =   _T   ("Intel   80486");  
  break;  
  case   5:  
  m_stProcessorLevel   =   _T   ("Pentium");  
  //   Check   if   the   MMX   instruction   set   is   availbale   or   not.  
  if   (IsProcessorFeaturePresent   (PF_MMX_INSTRUCTIONS_AVAILABLE))   {  
  m_stProcessorLevel   +=   _T   ("   MMX");  
  }  
  break;  
  case   6:  
  m_stProcessorLevel   =   _T   ("Pentium   (II/Pro)");  
  break;  
  }  
  }  
  else   if   (sysInfo.wProcessorArchitecture   ==   PROCESSOR_ARCHITECTURE_MIPS)   {  
  m_stArchitecture   =   _T   ("MIPS");  
  if   (sysInfo.wProcessorLevel   ==   0004)   {  
  m_stProcessorLevel   =   _T   ("MIPS   R4000");  
  }  
  else   {  
  m_stProcessorLevel   =   _T   ("Unknown");  
  }  
  }  
  else   if   (sysInfo.wProcessorArchitecture   ==   PROCESSOR_ARCHITECTURE_ALPHA)   {  
  m_stArchitecture   =   _T   ("Alpha");  
  itoa   (sysInfo.wProcessorLevel   ,   str,   10);  
  m_stProcessorLevel   =   m_stArchitecture   +   CString   (str);  
  }  
  else   if   (sysInfo.wProcessorArchitecture   ==   PROCESSOR_ARCHITECTURE_PPC)   {  
  m_stArchitecture   =   _T   ("PPC");  
  switch   (sysInfo.wProcessorLevel)   {  
  case   1:  
  m_stProcessorLevel   =   _T   ("PPC   601");  
  break;  
  case   3:  
  m_stProcessorLevel   =   _T   ("PPC   603");  
  break;  
  case   4:  
  m_stProcessorLevel   =   _T   ("PPC   604");  
  break;  
  case   6:  
  m_stProcessorLevel   =   _T   ("PPC   603+");  
  break;  
  case   9:  
  m_stProcessorLevel   =   _T   ("PPC   604+");  
  break;  
  case   20:  
  m_stProcessorLevel   =   _T   ("PPC   620");  
  break;  
  }  
  }  
  else   if   (sysInfo.wProcessorArchitecture   ==   PROCESSOR_ARCHITECTURE_UNKNOWN)   {  
  m_stArchitecture   =   _T   ("Unknown");  
  }  
  //   Check   page   size  
  itoa   (sysInfo.dwPageSize   ,   str,   10);  
  m_stPageSize   =   CString   (str);  
  //   Application   address  
  TCHAR   buffer   [64];  
  sprintf(   buffer,   "%p",   sysInfo.lpMaximumApplicationAddress);  
  m_stMaxAddress   =   _T   ("0x")   +   CString   (buffer);  
  sprintf(   buffer,   "%p",   sysInfo.lpMinimumApplicationAddress);  
  m_stMinAdress   =   _T   ("0x")   +   CString   (buffer);  
  //   Get   active   processor   mask  
  //   It   represent   how   many   processors   are   active   (??   I   am   not   sure)  
  itoa   (sysInfo.dwActiveProcessorMask   ,   str,   10);  
  m_stMask   =   CString   (str);  
  UpdateData   (FALSE);  
  return   (true);  
  }  
  void   CHardwareInfoDlg::GetMemory()  
  {  
  CString   memstr;  
  ::GlobalMemoryStatus(&mem);  
  memstr.Format("%d   %s",mem.dwTotalPhys/(1024*1024),"M");  
  m_memstr=memstr;  
  UpdateData(FALSE);  
  }  
  bool   CHardwareInfoDlg::GetMouseInfo()  
  {  
  int   mouseInfo[3]; //   We   need   an   array   (size   3)   of   int   for   mouse   information  
  TCHAR   str   [32];  
  BOOL   stat;  
  //   Check   if   mouse   is   present   or   not.  
  stat   =   GetSystemMetrics   (SM_MOUSEPRESENT);  
  if   (!stat)   {  
  m_stMouse   =   _T   ("Not   installed");  
  }  
  else   {  
  m_stMouse   =   _T   ("Installed");  
  //   Check   if   buttons   are   swapped  
  stat   =   GetSystemMetrics   (SM_SWAPBUTTON);  
  m_stButtonsSwapped   =   (stat)   ?   _T   ("Swapped")   :   _T   ("Not   swapped");  
  }  
  //   Get   mouse   speed  
  SystemParametersInfo   (SPI_GETMOUSE,   NULL,   mouseInfo,   NULL);  
  //   mouseInfo   [0]   &   mouseInfo   [1],   give   twp   threshold   values   for   mouse  
  //   mpuseInfo   [2]   gives   the   mouse   speed.  
  sprintf   (str,   "%d",   mouseInfo[2]);  
  m_stMouseSpeed   =   CString   (str);  
  UpdateData   (FALSE);  
  return   (true);  
  }  
  注意,sp5后,估计可以检测更新的硬件了。比如p3,p4,实现后,请告我。谢谢!Top

3 楼miaoshu(智障大师)回复于 2002-07-12 10:18:52 得分 0

多谢各位指点。  
   
  不过还是有问题,如何得到显卡、声卡、主板、磁盘大小等信息呢?Top

4 楼yhb4(胖子)回复于 2002-07-12 10:41:07 得分 0

up,upTop

5 楼devil97518(天使也会疯)回复于 2002-07-12 10:51:37 得分 20

通过wmi或者dmi可以得到,即便是远程的计算机页可以控制得到,  
  具体作比较麻烦,有兴趣可以讨论的。  
  fp_dream@hotmail.comTop

6 楼sunrace516(sunrace516)回复于 2002-07-13 10:45:36 得分 0

用windows优化大师,可以看到非常详细的硬件信息,不用编程:)Top

7 楼jovian0999()回复于 2002-07-13 10:52:06 得分 0

gzTop

8 楼netface(一生何求?)回复于 2002-07-13 16:02:39 得分 0

我原来也提过同样的问题,但没有解决,GetSystemInfo得到的信息极其有限,而且只能识别到奔腾档次的电脑  
  gzTop

9 楼FlyingSch(BoyWithWings)回复于 2002-07-13 16:08:59 得分 10

给你获得CPU ID 和制造商的代码。你这几问题可能要问上一个月  
   
  DWORD   dwId1,dwId2,dwId3,dwId4;  
  char   szCompany[13];  
  PCHAR   pCompany=szCompany;  
  CString   strShow;  
   
  szCompany[12]=0;  
  _asm  
  {  
  pushfd  
  pushad  
  //Get   CPU   id  
  mov   eax,1   //功能号  
  _emit   0x0f  
  _emit   0xa2  
  mov   dwId1,eax  
  mov   dwId2,ebx  
  mov   dwId3,ecx  
  mov   dwId4,edx  
   
  //   get   the   company  
  mov   edi,pCompany   //功能号  
          mov   eax,0  
  _emit   0x0f  
  _emit   0xa2  
  mov   eax,ebx  
  stosd  
  mov   eax,edx  
  stosd  
  mov   eax,ecx  
  stosd  
  popad  
  popfd  
  }  
  strShow.Format("CPU   ID     %08X%08X%08X%08X\r\nCompany     %s",dwId1,dwId2,dwId3,dwId4,szCompany);  
   
  MessageBox(strShow);Top

10 楼miaoshu(智障大师)回复于 2002-07-13 20:49:04 得分 0

汇编?!(吐血中......)  
   
  这个问题真的很难吗?本来还以为很简单。  
   
  不过这里高手这么多,应该会有办法的。  
   
  我顶!  
   
  Top

11 楼romanticist(桃花岛主--杭州)回复于 2002-07-15 09:36:54 得分 5

用   GetDeviceCaps     函数Top

12 楼yupeng1978(羽鹏)回复于 2002-07-15 09:42:17 得分 5

用GetSystemInfo具体查MSDNTop

13 楼yaotang(baobao)回复于 2002-07-16 09:27:15 得分 0

upTop

14 楼Free_Man(浪迹天涯)回复于 2002-07-16 09:40:26 得分 10

 
  void   CSysinfoDlg::OnMemory()    
  {  
  MEMORYSTATUS   *mymem;  
  char   s[6][20];  
   
  //获得系统内存情况  
  mymem   =   new   MEMORYSTATUS;  
  GlobalMemoryStatus(mymem);  
   
          if(mymem->dwMemoryLoad>1024)  
  {  
  mymem->dwMemoryLoad/=1024;  
  _itoa(mymem->dwMemoryLoad,s[0],10);  
  m_usedmem=s[0];  
  m_usedmem+="   KB";  
  }  
          else  
  {  
                  _itoa(mymem->dwMemoryLoad,s[0],10);  
                  m_usedmem=s[0];  
  m_usedmem+="   Byte";  
  }  
   
  _itoa(mymem->dwTotalPhys/1024,s[1],10);  
  _itoa(mymem->dwTotalPageFile/1024,s[2],10);  
  _itoa(mymem->dwAvailPageFile/1024,s[3],10);  
          _itoa(mymem->dwTotalVirtual/1024,s[4],10);  
  _itoa(mymem->dwAvailVirtual/1024,s[5],10);  
  m_availvirtual.Format("%s   KB",s[5]);  
  m_totalvirtual.Format("%s   KB",s[4]);  
  m_totalpage.Format("%s   KB",s[2]);  
  m_availpage.Format("%s   KB",s[3]);  
  m_totalmem.Format("%s   KB",s[1]);  
   
  UpdateData(FALSE);  
   
  delete   mymem;  
  }  
       
  void   CSysinfoDlg::OnDisk()    
  {  
  int   drive;  
  CString   disk[26],diskinfo;  
  CString   scrxy;  
   
          //通过转换当前盘的方式测试磁盘  
          for(   drive   =   1;   drive   <=   26;   drive++   )  
  if(   !_chdrive(   drive   )   )  
  {  
        disk[drive].Format(   "%c:   ",drive   +   'A'   -   1   );        
        diskinfo   =   diskinfo   +   disk[drive];  
                  }  
   
  m_Diskvol.SetWindowText(diskinfo);  
   
  //获得屏幕分辨率  
  int   x   =   GetSystemMetrics(SM_CXSCREEN);  
  int   y   =   GetSystemMetrics(SM_CYSCREEN);  
   
  scrxy.Format("%d   *   %d",x,y);  
   
  m_Scr.SetWindowText(scrxy);  
  }  
   
  void   CSysinfoDlg::OnSystem()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  char   s[20];  
  LPSYSTEM_INFO   mysys;  
  mysys=new   SYSTEM_INFO;  
  GetSystemInfo(mysys);  
  _itoa(mysys->dwNumberOfProcessors,s,10);  
  m_cpunum=s;  
  _itoa(mysys->dwProcessorType,s,10);  
  m_cputype=s;  
  switch   (mysys->wProcessorLevel)  
  {  
      case   3:  
          m_cpulevel="Intel   80386";  
  break;  
      case   4:  
                  m_cpulevel="Intel   80486";    
                  break;  
      case   5:  
  m_cpulevel="Pentium";  
  break;  
      default:  
  m_cpulevel="未知的CPU";  
  }  
  _itoa(mysys->wProcessorRevision,s,10);  
  m_cpurevision=s;  
  delete   mysys;  
  UpdateData(FALSE);  
  }  
   
  void   CSysinfoDlg::OnWinifo()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  char   windir[MAX_PATH];  
   
  //获得Windows目录  
  GetWindowsDirectory(windir,MAX_PATH);  
  m_Windir.SetWindowText(windir);  
   
  //获得Windows系统目录  
  GetSystemDirectory(windir,MAX_PATH);  
  m_Winsys.SetWindowText(windir);  
   
   
  //获得操作系统信息  
  OSVERSIONINFO   osvi;  
  CString   winver,os;  
   
  osvi.dwOSVersionInfoSize   =   sizeof(OSVERSIONINFO);  
  GetVersionEx   (&osvi);  
   
  switch(osvi.dwPlatformId)  
  {  
  case   0:  
  os   =   "Windows   3.x";  
  break;  
  case   1:  
  os   =   "Windows   95/98/Me";  
  break;  
  case   2:  
  os   =   "Windows   NT/2000";  
  break;  
  }  
   
  winver.Format("Version:%d.%d   Builder:%d",osvi.dwMajorVersion,osvi.dwMinorVersion,osvi.dwBuildNumber);  
  m_Winver.SetWindowText(winver);  
  m_Winplt.SetWindowText(os);  
   
  }  
   
  void   CSysinfoDlg::OnCpu()    
  {  
  char   s[20];  
  LPSYSTEM_INFO   mysys;  
  mysys=new   SYSTEM_INFO;  
  GetSystemInfo(mysys);  
   
  _itoa(mysys->dwNumberOfProcessors,s,10);  
  m_cpunum=s;  
  _itoa(mysys->dwProcessorType,s,10);  
  m_cputype=s;  
  switch   (mysys->wProcessorLevel)  
  {  
      case   3:  
          m_cpulevel="Intel   80386";  
  break;  
      case   4:  
                  m_cpulevel="Intel   80486";    
                  break;  
      case   5:  
  m_cpulevel="Pentium";  
  break;  
      default:  
  m_cpulevel="未知的CPU";  
  }  
  _itoa(mysys->wProcessorRevision,s,10);  
  m_cpurevision=s;  
  delete   mysys;  
  UpdateData(FALSE);  
  }  
  Top

15 楼miaoshu(智障大师)回复于 2002-07-16 14:18:51 得分 0

CPU、内存俺知道怎么得到了,可是剩下的问题。。。。。。  
   
  干脆,我这么问吧,怎么得到显卡的型号、声卡的型号、主板插槽数、磁盘容量?Top

16 楼Yings()回复于 2002-07-16 14:50:50 得分 40

用WMI吧!  
  去微软的网站down一个WMI的SDK,里边有一个例程看看就知道了。Top

17 楼miaoshu(智障大师)回复于 2002-07-17 11:32:39 得分 0

WMI果然好用,多谢各位关注和指教!Top

相关问题

  • 续:如何获取机器的详细硬件信息?
  • 对硬件技术很菜,求2机器组局域网方法.设备已基本有.急!!!!!
  • api与机器硬件的相关信息问题
  • 如何读取机器的硬件信息?
  • 怎样看Unix机器的硬件配置
  • 怎么才能知道一台机子各硬件的详细情况,如硬件厂商,硬件型号
  • 怎么配置自己的机器为web服务器,详细?
  • 求解:picture详细属性、方法!
  • 请教 App.config 的详细使用方法
  • 求LineStart的详细使用方法

关键词

  • 硬件
  • intel
  • 信息
  • os
  • mymem
  • dwid
  • stprocessortype
  • itoa
  • sysinfo
  • dwprocessortype

得分解答快速导航

  • 帖主:miaoshu
  • nevergrief
  • devil97518
  • FlyingSch
  • romanticist
  • yupeng1978
  • Free_Man
  • Yings

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问