CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

但愿有人能给出答案。

楼主CyberHuman(流浪的猫)2002-06-02 19:19:33 在 C++ Builder / 基础类 提问

怎么得到像win优化大师开始进入界面那些系统硬件信息? 问题点数:100、回复次数:17Top

1 楼wyb_Ultra(咖啡)回复于 2002-06-02 19:33:52 得分 0

大部分都可以用api函数得到,如果想简单点,装一些能得到那些信息的控件就行。Top

2 楼iec(bcbtovs)回复于 2002-06-02 20:06:28 得分 0

对调用winapi函数,很简单的Top

3 楼wyb_Ultra(咖啡)回复于 2002-06-02 20:08:42 得分 0

我想,里面的计算机系统的信息大部分是从注册表中得到的,你找本讲注册表的书看看就一目了然了。而计算机设备的的信息应该是用api函数得到的,很多BCB的书都有提到。Top

4 楼phenix_jjg(好朋友天天见)回复于 2002-06-02 20:48:50 得分 0

同意楼上的意见。Top

5 楼Keng(白朗)回复于 2002-06-02 22:20:11 得分 0

http://go7.163.com/123comcom/winapi/look.html  
  去下载api大全看看吧。Top

6 楼codecb(阿星)回复于 2002-06-02 23:05:10 得分 0

有API好像没这么正确吧?  
  比如CPU频率,BIOS的DIM信息....有这样的API吗?Top

7 楼zdb1025(三皮)回复于 2002-06-02 23:11:15 得分 0

关注Top

8 楼bigwhiteshark(变性鲨鱼)回复于 2002-06-03 00:37:03 得分 0

你最好问问作者  
  并且注册该软件  
  我想他们会给你比我们给你的更多Top

9 楼dycdyc123(重出江湖)回复于 2002-06-03 07:44:41 得分 20

我找来的给你看看!:  
   
   
        在我们编写的程序中常常要和硬件打交道,那么如何在程序中确定系统中是否有该   设备,它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需   简单地利用几个API函数,硬件的问题并不神秘。下面就让我们一起看看在C++   Build   er中是如何检测硬件的。  
   
    1.   检测CPU的型号  
   
    先让我们从最简单的做起,看一看自己的CPU型号。首先,在C++   Builder中画   出图1所示的窗体,在下面的几个例子中我们将一直使用这个窗体作示范,它包括一个用   来激活测试的Button和一个用来显示结果的Memo。我们可以用GetSystemInfo这个API获   得CPU的型号。将下列代码添加到Button的Click事件里就可以了:  
   
    void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
    {  
    //获得CPU型号  
    SYSTEM_INFO   systeminfo;  
    GetSystemInfo   (&systeminfo);  
    Memo1→Lines→Add(“您的CPU类型是:”+String(   systeminfo.dwProcessorTy   pe   ));  
    }  
    运行它,点击Test试试,CPU型号出来了吧!  
    2.检测内存状态  
    获得内存状态的方法和CPU型号差不多,只是他用到的是另外一个API:GlobalMe   moryStatus。其中,成员dwTotalPhys用来获得物理内存总量,而dwAvailPhys顾名思义   是有效物理内存的意思。我们只要把下面几行代码加到上面程序的后面就可以了(不用   重做,下同):  
    //获得内存状态  
    MEMORYSTATUS   memory;  
    memory.dwLength   =sizeof(memory);   //初始化  
    memory.dwLength   =sizeof(memory);   //初始化  
    GlobalMemoryStatus(&memory);  
    Memo1→Lines→Add(“您的物理内存是(Mb):”+String(int(memory.dwTotalPh   ys   /1024/1024)));  
    Memo1→Lines→Add(“其中可用内存是(Kb):”+String(int(   memory.   /1024))   );  
    怎么样,看出点门道了么?两段程序的格式几乎一模一样,其实,GetSystemInf   o和GlobalMemoryStatus还可以获得许多其他有关CPU和内存的信息,就按照上面的格式   去套就行了,更详细的资料可以去看C++   Builder4的Help。  
    3.   检测可用硬盘空间  
    好了,经过前面两个简单问题的热身,我们来处理一个稍微复杂的问题:我们知   道安装程序大都有一个检测硬盘空间的过程,那么这是怎么实现的呢?他用到的是   API函   数GetDiskFreeSpace,这个函数输入一个参数:目标盘的路径;返回四个参数,依次是   每簇的扇区数、每扇区的字节数、空闲的簇数、总簇数。假如我们需要检测C盘的总容量   和可用容量,那么可以把以下代码加到上面的程序中:  
    //获得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));  
    怎么样?现在可以自己做安装程序了吧!  
    4.   检测CD-ROM  
    我们在编写程序时常常需要读取CD-ROM,可是究竟哪一个盘符是光驱呢?有人是   桓雠谭枪馇兀坑腥耸?   将最后一个盘符当作光驱的,但是当遇到双光驱或者MO的情况时常常会出错。其实这个   问题用一个API来解决并不困难,这就是:GetDriveType(),这个函数返回一个0~6之间   的值,依次代表:0—未知盘、1—不存在、2—可移动磁盘、3—固定磁盘、4—网络磁盘   、5—CD-ROM、6—内存虚拟盘。因此我们可以添加下面代码来寻找CD-ROM:  
    //   获得CD-ROM信息  
    UINT   type;  
    char   name;  
    for   (name=‘C’;name<=‘Z’;name++)   //循环检测A~Z  
    {   type   =   GetDriveType((String(name)+String(‘:’)).c_str());   //获得磁   盘类型  
    if   (type==5)  
    Memo1→Lines→Add(“您的光驱盘符为:”+String(name));  
       }  
    得到光驱盘符之后我们可以进一步利用API函数GetVolumeInformation检测光驱中   是否有光盘,这个函数如果成功调用,会得到磁盘的卷标序列号等信息;如果调用失败   则可知光驱中无光盘,程序如下://检测光盘(假设光驱为G:)  
    char   volname[255],filename[100];//buffer[512];  
    DWORD   sno,maxl,fileflag   ;  
    if   (!(GetVolumeInformation(“G:”,   volname,255,&sno,&maxl,&fileflag   ,filename,100)))  
       //如果返回值为假  
    Memo1→Lines→Add   (“G驱中没有发现光盘”);  
       else  
       //如果返回值为真  
    {Memo1→Lines→Add   (“G驱中光盘卷标为:”+String(volname));  
    Memo1→Lines→Add   (“G驱中光盘序号为:”+String(sno));  
       }  
    5.   检测声卡配置  
    在编制多媒体程序时,我们常常会用到声音文件,而当这些程序在没有配置声卡   的机器上运行时,我们应该给出必要的警告。对于声卡的检测,可以分别通过waveOutG   etNumDevs()和midiOutGetNumDevs()检测波形设备和MIDI设备,再利用waveOutGetDevC   aps()和midiOutGetDevCaps()获得声音设备的细节资料。将下面一段代码加入上面的程   序即可,但要注意将#include   添至程序首部:  
    //检测声卡  
    int   wavedevice,mididevice;  
    WAVEOUTCAPS   wavecap;  
    MIDIOUTCAPS   midicap;  
    wavedevice=(int)waveOutGetNumDevs();   //波形设备信息     mididevice=(int)midiOutGetNumDevs();   //   MIDI设备信息     mididevice=(int)midiOutGetNumDevs();   //   MIDI设备信息  
    if   (wavedevice==0)  
    Memo1→Lines→Add   (“没有发现波形设备”);  
    else  
    {waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS));  
    Memo1→Lines→Add   (“当前波形设备:”+String(wavecap.szPname));  
       }  
    if   (mididevice==0)  
    Memo1→Lines→Add   (“没有发现MIDI设备”);  
    else  
    {midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS));  
    Memo19→Lines→Add   (“当前MIDI设备:”+String(midicap.szPname));  
       }  
    6.   检测显示器信息  
    编写和图形图像有关的程序时常常需要检测显示器的分辨率和色深,最后我们来   看看这个问题的解决办法。分辨率的求法很简单,直接调用Screen对象的属性就行了。   而要求色深则要利用API函数GetDeviceCaps获得每像素的比特数和色彩的页面数,然后   计算2的“每像素的比特数”次幂即得色彩的梯度数,再计算“色彩的梯度数”的“色彩   的页面数”次幂即得色深。由于该段绦蛴玫搅嗣菰怂悖砸堑眉由希nclude   ,   程序如下:  
    //检测显示器  
    int   tcs;  
    long   int   bpp,cp,tc;  
    Memo1→Lines→Add   (“当前分辨率为:”+String(Screen→Width)+“*”+S   tring(Screen→Height));  
    bpp=GetDeviceCaps(Form1→Canvas→Handle   ,BITSPIXEL);  
    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));  
    好了,现在在让我们点击一下Test吧,硬件情况尽收眼底(图2)!其实本文所涉   及的API函数的功能不止这些,大家下去可以查一查Win32   API手册,或者直接在C++   Builder   4中察看Help。相信自己开发一个硬件检测软件也不是难事哦!  
    以上程序均在Windows98中文版、C++   Builder   4中调试通过,如果大家在硬件   检测方面有什么问题,请与本文作者探讨,AlexYoung@263.net。    
  //==========================================================  
   
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Unit1.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
                  :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
   
  void   __fastcall   TForm1::FormClick(TObject   *Sender)  
  {  
          DWORD   dwSize=MAX_COMPUTERNAME_LENGTH+1;  
          char   szBuf[MAX_COMPUTERNAME_LENGTH+1];  
          szBuf[0]='\0';  
          GetComputerName(szBuf,&dwSize);  
          Label1->Caption=szBuf;  
   
          OSVERSIONINFO   info;  
          info.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);  
          GetVersionEx(&info);  
          Memo1->Lines->Clear();  
          Memo1->Lines->Add("Major   Version:"+IntToStr(info.dwMajorVersion));  
          Memo1->Lines->Add("Minor   Version:"+IntToStr(info.dwMinorVersion));  
          Memo1->Lines->Add("Build   Number:"+IntToStr(info.dwBuildNumber));  
          Memo1->Lines->Add("PlatForm   ID:"+IntToStr(info.dwPlatformId));  
          Memo1->Lines->Add("CSDVersion:"+AnsiString(info.szCSDVersion));  
   
          Memo1->Lines->Add("");  
          if(info.dwMajorVersion<4)  
                Memo1->Lines->Add("Windows   NT   3.x   Detected!");  
          switch(info.dwPlatformId)  
          {  
                case   VER_PLATFORM_WIN32s:  
                    Memo1->Lines->Add("WIN32s   Detected!");  
                    break;  
                case   VER_PLATFORM_WIN32_WINDOWS:  
                    Memo1->Lines->Add("Win95   or   Win98   Detected!");  
                    break;  
                case   VER_PLATFORM_WIN32_NT:  
                    Memo1->Lines->Add("Wondows   NT   detected!");  
                    break;  
   
          }  
   
      ShellExecute(Handle,NULL,"command","/c   ping   www.263.net>aa.txt",NULL,SW_SHOWTop

10 楼CyberHuman(流浪的猫)回复于 2002-06-03 18:08:48 得分 0

多谢!  
  本人学习用。Top

11 楼CyberHuman(流浪的猫)回复于 2002-06-03 18:14:18 得分 0

但是还是不具体,像优化大师那样具体仅仅这样是不够的。这个仅仅是调用api,而现有的api好象实现不了哪些功能,是不是要用到win32asm?  
  请指点。Top

12 楼CyberHuman(流浪的猫)回复于 2002-06-04 10:47:38 得分 0

再up一次,希望能遇到解决方案。  
  谢谢dycdyc123(重出江湖)   提供的方法,但我觉得提供的信息不够具体。  
  例如不能说明cpu是celeron还是pentium只类的  
  Top

13 楼Sword_Light(三尺水)回复于 2002-06-04 11:05:03 得分 0

我有一个控件(有源码),完全能满足你的需要,它所检测出来的硬件信息简直是太详细了,太详细了,太详细了!!!如果你要,留下E_MailTop

14 楼alang_xy((无名))回复于 2002-06-04 11:22:31 得分 0

我去过作者的主页看过的,大部分都要用到win32Api,这些事应能稿定。  
  不过作者谈到一点,说是在取得CPU时钟时,用到了读BIOS的技术,用API读的不准,就自己用汇编实现了读主板BIOS来得到这些信息。作者的功底是很深的。  
   
  这个软件十分的好的用,是个小工具,原来我一直用《超组魔法兔子》,但后者是用VB写的,几年不升级,我看了最新的版本,作者功底还是有限。在系统优化这个领域已经比不上《window优化大师》了。Top

15 楼CyberHuman(流浪的猫)回复于 2002-06-05 12:17:32 得分 0

Sword_Light(三尺水)   :  
  freeia@163.com  
  不胜感激。Top

16 楼CyberHuman(流浪的猫)回复于 2002-06-05 12:19:15 得分 0

alang_xy(浪人):    
  用api好象是得不到这么详细的东西的,包括显卡,硬盘,声卡之类的东西的。    
  Top

17 楼Sword_Light(三尺水)回复于 2002-06-05 13:42:18 得分 80

to   CyberHuman(后知后觉)   :发过去了,你收一下吧,1.5MTop

相关问题

  • ====但愿有人知道!====
  • 555……为什么有人得了答案后不给分?
  • 我要答案,给我答案,还我答案!
  • 有答案就给分!
  • 有答案立即给分!
  • 请给出答案CCCCCCCCCCCCCCCCCCCCCCCCCCC
  • 据说是微软的面试题,头不怕大的进(有人不同意答案,再给分20)
  • 这是个老问题,但是没有人回答的很让我信服!!! 快给我个答案先!!!
  • 像这种没有人给出正确答案的帖子,能不能直接删除而不扣我分啊!?
  • 急需答案!!!!!我只能放100,有答案,再给分!

关键词

  • win32
  • 检测
  • 内存
  • 函数
  • 型号
  • 硬盘
  • 硬件
  • 代码
  • api
  • cpu

得分解答快速导航

  • 帖主:CyberHuman
  • dycdyc123
  • Sword_Light

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo