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

高分求读取主板系列号的BCB源码。

楼主pms(高山流水)2001-11-18 00:03:55 在 C++ Builder / 基础类 提问

或控件也行,但必须是在BCB5下能正常使用。 问题点数:200、回复次数:40Top

1 楼wyb_star(孤星)回复于 2001-11-18 10:33:18 得分 10

主板的序列就在内存中0xfec71处,不过只能在98下取出,2000不允许对这段内存进行操作,  
  所以取不出来!  
  不知道还有什么办法可以在2000下取出来!  
  Top

2 楼zzzsssccc(今天正为明天后悔)回复于 2001-11-18 13:29:10 得分 0

关注Top

3 楼liulynx(可能我能力不够,但我会尽力)回复于 2001-11-18 14:14:23 得分 0

请教wyb_star(孤星),加载主板的序列于内存中的时间和机理,主板的序列是存在BIOS中吗?Top

4 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-18 14:38:34 得分 0

f000:ec71,我看的是delphi的程序,不知bcb中怎么读取这段内存地址的数据?好像必需的用SectionSelector?!Top

5 楼cobi(我是小新)回复于 2001-11-18 14:45:39 得分 0

无法帮你找到这方面的内容,只有其他硬件信息的程序Top

6 楼pms(高山流水)回复于 2001-11-18 15:08:42 得分 0

或者能读取硬盘硬件系列号(非格式化后的卷标系列号)的控件或BCB源码也行。前几日从这里:http://home.online.tj.cn/user/dandy/ 下载了读取硬盘系列号控件和读取主板、CPU系列号控件,但我经试用后发现,读取主板、CPU系列号控件在Windows   2000和Windows   98下都不能正常使用,都会出现:EAccessViolation错误;而读取硬盘系列号控件在Windows   2000下能正常使用,而在Windows   98下不能正常使用。我写信给作者也没有回音。不知哪位delphi高手能将这两个控件修正一下?Top

7 楼wyb_star(孤星)回复于 2001-11-18 17:03:44 得分 0

to   juqiang(巫山云雨方枪枪):  
        C++:$fec71  
        Pascal:0xfec71  
  该结束了吧!Top

8 楼wyb_star(孤星)回复于 2001-11-18 17:04:27 得分 10

写反了,是  
  pascal:$fec71  
  C++:0xfec71  
  Top

9 楼cobi(我是小新)回复于 2001-11-18 19:38:42 得分 20

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));  
   
  void   __fastcall   TForm1::Button10Click(TObject   *Sender)    
  {    
     
     
  /*GUID   guid;    
  char   address[30];    
  if(CoCreateGuid(&guid)!=S_OK)    
  ShowMessage("Error");    
  else    
  {    
  sprintf(address,    
  "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X",    
  guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3],    
  guid.Data4[4],guid.Data4[5],guid.Data4[6],guid.Data4[7]);    
  address[25]   ='\0';    
  ShowMessage(address);    
  }     */    
     
  typedef   struct   _ASTAT_    
  {    
          ADAPTER_STATUS   adapt;    
          NAME_BUFFER         NameBuff   [30];    
  }ASTAT,   *   PASTAT;    
     
          ASTAT   Adapter;    
          NCB   ncb;    
          UCHAR   uRetCode;    
          AnsiString   MachineName;    
          char   NetName[50];    
          memset(   &ncb,   0,   sizeof(ncb)   );    
          ncb.ncb_command   =   NCBRESET;    
          ncb.ncb_lana_num   =   0;    
          uRetCode   =   Netbios(   &ncb   );    
          if   (uRetCode!=0)    
                  ShowMessage("网卡初始化失败!");    
          memset(&ncb,   0,   sizeof(ncb)   );    
          ncb.ncb_command   =   NCBASTAT;    
          ncb.ncb_lana_num   =   0;    
          memset(ncb.ncb_callname,'   ',NCBNAMSZ);    
          MachineName=Edit1->Text.UpperCase();    
          strncpy(ncb.ncb_callname,MachineName.c_str(),MachineName.Length());    
          ncb.ncb_buffer   =   (char   *)   &Adapter;    
          ncb.ncb_length   =   sizeof(Adapter);    
     
          uRetCode   =   Netbios(   &ncb   );    
          if   (   uRetCode   ==   0   )    
          {    
                  AnsiString   Address;    
                  int   i;    
                  Address="";    
                  for(i=0;i<6;i++)    
                  {    
                          Address+=IntToHex((int)Adapter.adapt.adapter_address[i],2);    
                  }    
                  ShowMessage(Address);    
          }    
             
  }    
  //---------------------------------------------------------------------------    
  cpuid用汇编,但是只有p3才有,以前的是"genie   intel"之类的.Top

10 楼pms(高山流水)回复于 2001-11-18 20:18:24 得分 0

to   cobi(我是小新,我只有5岁):  
  你这代码,好象不对吧?我不要磁盘的卷标系列号,要的是硬盘的出厂系列号。另外,我要的是主板的系列号,而不是网卡的系列号。Top

11 楼pms(高山流水)回复于 2001-11-18 22:18:42 得分 0

看来这里越来越冷清了!高手也越来越少了!Top

12 楼pms(高山流水)回复于 2001-11-18 23:59:41 得分 0

转个地方看看。Top

13 楼knf(CTO-首席打字员)回复于 2001-11-19 00:02:51 得分 0

记得回来Top

14 楼pms(高山流水)回复于 2001-11-19 00:25:06 得分 0

好的!Top

15 楼CityHost(市长)回复于 2001-11-19 10:30:27 得分 0

DDK行Top

16 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-19 10:45:15 得分 10

我昨天找了一下,WindowManagement可以,你搜索msdn,找wmi就可以,我有时间尝试一下。Top

17 楼pms(高山流水)回复于 2001-11-19 13:04:04 得分 0

to   juqiang(巫山云雨方枪枪)  
  我找不到什么啊?能不能再具体告知?谢谢!Top

18 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-19 14:33:40 得分 30

我贴上wmi例子:取硬盘各种参数的程序(包含硬盘序列号)。但是定义的PerfClass,我无法找到类似于“MSDiskDriver_PerformanceData”的声明(好像放到dll里面了)。查找msdn,这是个连接(关于主板的)  
   
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/us_prov_0pf6.asp  
   
  下面是取硬盘参数的代码:(你可能的需要安装wmi的sdk,我down了一个,8M多)  
   
   
  //***************************************************************************    
  //    
  //         Copyright   (c)   1997-1999   Microsoft   Corporation    
  //    
  //         File:     dpdetail.cpp    
  //    
  //         Description:    
  //                 This   file   implements   the   DiskPerfDetails()   routine   which      
  //                 demonstrates   how   to   enumerate   properties   for   the   DiskPerf    
  //                 class   and   instances.    
  //    
  //         Part   of   :         WMIDiskPerf    
  //    
  //     History:            
  //    
  //***************************************************************************    
   
  #include   <wbemidl.h>    
  #include   <stdio.h>    
   
  void   ShowPropInfo(   IWbemClassObject   *pInst   );    
   
  char   PropListHeader[]   =    
          "DiskPerf   Property   Descriptions:\n\n"    
          "WMI   Data   ID\tProperty\tDescription\n"    
          "======================================="    
          "=======================================\n"    
          "";    
   
   
  //==============================================================================    
  //    
  //         DiskPerfDetails(   IWbemServices   *   pIWbemServices   )      
  //    
  //==============================================================================    
  void   DiskPerfDetails(   IWbemServices   *   pIWbemServices   )      
  {    
          HRESULT                 hr;    
          long                 lLower,   lUpper,   lCount;      
          SAFEARRAY         *psaNames   =   NULL;    
          BSTR                 PropName     =   NULL;    
          VARIANT                 vVal;    
          ULONG                 uReturned;    
   
          IEnumWbemClassObject         *pEnum             =   NULL;    
          IWbemClassObject                 *pPerfData     =   NULL;    
          IWbemClassObject                 *pPerfInst     =   NULL;    
          IWbemQualifierSet                 *pQualSet       =   NULL;    
   
          VariantInit(   &vVal   );    
   
          //   Alloc   class   name   string   for   DiskPerf    
          BSTR   PerfClass   =   SysAllocString(   L"MSDiskDriver_PerformanceData"   );    
   
          //   Get   the   Descriptions   for   the   WMIDataId   properties   in   the   Embedded   class.    
          //   Here   the   object   info   for   the   Class   -   MSDiskDriver_PerformanceData   is    
          //   retrieved   and   displayed.    
   
          //   Collect   object   information   for   PerfClass    
          hr   =   pIWbemServices->GetObject(   PerfClass,    
                                                                              0L,    
                                                                              NULL,    
                                                                              &pPerfData,    
                                                                              NULL   );    
          SysFreeString(   PerfClass   );    
   
          if   (   hr   ==   WBEM_NO_ERROR   )    
          {    
                  //   show   the   property   description   list   header    
                  printf(   PropListHeader   );    
   
                  //   Load   up   a   safearray   of   property   names    
                  if   (   (   pPerfData->GetNames(   NULL,    
                                                                          WBEM_FLAG_ALWAYS   |   WBEM_FLAG_NONSYSTEM_ONLY,    
                                                                          NULL,      
                                                                          &psaNames   )   )   ==   WBEM_NO_ERROR   )    
                  {    
                          //   Get   the   upper   and   lower   bounds   of   the   Names   array    
                          if   (   (   hr   =   SafeArrayGetLBound(   psaNames,   1,   &lLower   )   )   ==   S_OK   )      
                          {    
                                  hr   =   SafeArrayGetUBound(   psaNames,   1,   &lUpper   );    
                          }    
   
                          if   (   hr   !=   S_OK   )      
                          {    
                                  printf(   "Problem   with   property   name   array.\n"   );    
                          }    
                          else    
                          {    
                                  BSTR   WmiQual     =   SysAllocString(   L"WmiDataId"   );    
                                  BSTR   DescQual   =   SysAllocString(   L"Description"   );    
                                  UINT   uWmiId;    
   
                                  for   (   lCount   =   lLower;   lCount   <=   lUpper;   lCount++   )      
                                  {    
                                          //   get   the   property   name   for   this   element    
                                          if   (   (   SafeArrayGetElement(   psaNames,      
                                                                                                  &lCount,      
                                                                                                  &PropName))   ==   S_OK   )    
                                          {    
                                                  if   (   (   pPerfData->GetPropertyQualifierSet(   PropName,   &pQualSet   )   )   ==   WBEM_NO_ERROR   )      
                                                  {    
                                                          //   check   to   see   if   the   property   is   a   WMI   data   Item   and   save   its   description    
                                                          //   these   are   the   DiskPerf   counters    
                                                          if   (   (   pQualSet->Get(   WmiQual,   0L,   &vVal,   NULL   )   )   ==   WBEM_NO_ERROR   )    
                                                          {    
                                                                  uWmiId   =   vVal.lVal;    
   
                                                                  VariantClear(   &vVal   );    
                                                                  if   (   (   pQualSet->Get(   DescQual,   0L,   &vVal,   NULL   )   )   ==   WBEM_NO_ERROR   )    
                                                                  {    
                                                                          wprintf(   L"(   %d   )\t\t%s\t%s\n",   uWmiId,   PropName,   vVal.bstrVal   );    
                                                                          VariantClear(   &vVal   );    
                                                                  }    
                                                          }    
   
                                                          pQualSet->Release(   );      
                                                          pQualSet   =   NULL;    
                                                  }    
                                                  SysFreeString(   PropName   );    
                                          }    
                                  }    
                                  SysFreeString(   WmiQual   );    
                                  SysFreeString(   DescQual   );    
                          }    
                          SafeArrayDestroy(   psaNames   );    
                  }    
                  pPerfData->Release(   );    
          }    
   
   
          //   Now   that   the   data   class   info   is   displayed,   go   get   the   values   for   all   the    
          //   disk   instances    
   
          PerfClass   =   SysAllocString(   L"MSDiskDriver_Performance"   );    
   
          //   Create   enumerator   for   all   disk   instances    
          hr   =   pIWbemServices->CreateInstanceEnum(   PerfClass,    
                                                                                            WBEM_FLAG_SHALLOW,    
                                                                                            NULL,    
                                                                                            &pEnum   );    
          SysFreeString(   PerfClass   );    
   
          if   (   hr   ==   WBEM_NO_ERROR   )    
          {    
                  while   (   pEnum->Next(   INFINITE,    
                                                            1,    
                                                            &pPerfInst,    
                                                            &uReturned   )   ==   WBEM_NO_ERROR   )    
                  {    
                          //   Explicitly   get   the   properties   of   InstanceName   and   Active   state    
   
                          //   Get   the   Instance   Name   string    
                          PropName   =   SysAllocString(   L"InstanceName"   );    
                          if   (   (   pPerfInst->Get(   PropName,      
                                                                        0L,      
                                                                        &vVal,      
                                                                        NULL,   NULL   )   )   ==   WBEM_NO_ERROR   )      
                          {    
                                  wprintf(   L"\n%s\n",   vVal.bstrVal   );    
                                  VariantClear(   &vVal   );    
                          }    
   
                          //   Get   Active   status   boolean    
   
                          PropName   =   wcscpy(   PropName,   L"Active"   );    
                          if   (   (   pPerfInst->Get(   PropName,      
                                                                        0L,      
                                                                        &vVal,      
                                                                        NULL,   NULL   )   )   ==   WBEM_NO_ERROR   )      
                          {    
                                  wprintf(   L"\t%s\t\t=   %s\n",   PropName,   vVal.boolVal   ?   L"TRUE"   :   L"FALSE"   );    
                                  VariantClear(   &vVal   );    
                          }    
   
                          //   Get   the   performance   data   embedded   object    
                          PropName   =   wcscpy(   PropName,   L"PerfData"   );    
                          if   (   (   pPerfInst->Get(   PropName,      
                                                                        0L,      
                                                                        &vVal,      
                                                                        NULL,   NULL   )   )   ==   WBEM_NO_ERROR   )      
                          {    
                                  if   (   vVal.punkVal->QueryInterface(   IID_IWbemClassObject,    
                                                                                                      (PVOID   *)   &pPerfData   )   ==   S_OK   )    
                                  {    
                                          //   display   the   WMI   data   item   from   this   instance    
                                          ShowPropInfo(   pPerfData   );    
                                          pPerfData->Release(   );    
                                  }    
                                  VariantClear(   &vVal   );    
                          }    
   
                          SysFreeString(   PropName   );    
   
                          pPerfInst->Release(   );    
                  }    
                  pEnum->Release(   );    
          }    
          else    
          {    
                  printf(   "Can't   enumerate   DiskPerf   instances!\n"   );    
          }    
  }    
   
   
  //   Display   property   names   and   values   for   an   instance.    
  void   ShowPropInfo(   IWbemClassObject   *pInst   )    
  {    
          HRESULT   hr;    
          VARIANT   vVal;    
          BSTR   PropName;    
   
          if   (   pInst   )    
          {    
                  hr   =   pInst->BeginEnumeration(   WBEM_FLAG_LOCAL_ONLY   );    
                  while   (   hr   ==   WBEM_NO_ERROR   )    
                  {    
                          if   (   (   hr   =   pInst->Next(   0,   &PropName,    
                                                                                &vVal,      
                                                                                NULL,   NULL   )   )   ==   WBEM_NO_ERROR   )      
                          {    
                                  switch(   vVal.vt   )    
                                  {    
                                          case   VT_I4:    
                                          {    
                                                  wprintf(   L"\t%s\t=   %d\n",   PropName,   vVal.lVal   );    
                                          }    
                                          break;    
   
                                          case   VT_BSTR:    
                                          {    
                                                  wprintf(   L"\t%s\t=   %s\n",   PropName,   vVal.bstrVal   );    
                                          }    
                                          break;    
   
                                          default:    
                                          {    
                                                  wprintf(   L"\t%s\t=   NULL\n",   PropName   );    
                                          }    
                                          break;    
                                  }    
                                  VariantClear(   &vVal   );    
                                  SysFreeString(   PropName   );    
                          }    
                  }    
                  pInst->EndEnumeration(     );    
          }    
  }    
  Top

19 楼pms(高山流水)回复于 2001-11-19 14:57:37 得分 0

谢谢juqiang(巫山云雨方枪枪),你能不能告诉我wmi在哪下载吗?Top

20 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-19 15:04:24 得分 10

sdk   for   WMI:  
   
  http://download.microsoft.com/download/platformsdk/sdkx86/1.5/NT45/EN-US/wmisdk.exe  
   
  安装后的samples\vc\WMIDiskPerf目录下,有上面的程序,用vc6打开就可以了。M$说所有wmi的应用只能用vc6或更高版本进行,我没试验过CBuilder是否可以?我以前用ADSI建立虚拟目录(CBuilder3)就不可以。Top

21 楼pms(高山流水)回复于 2001-11-19 22:09:47 得分 0

CBuilder不行?唉,我空欢喜一场。Top

22 楼lubing317(天行者)回复于 2001-11-20 00:15:01 得分 0

不知所云Top

23 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-20 08:29:09 得分 0

hope   M$   can   help   us!Top

24 楼pms(高山流水)回复于 2001-11-20 20:31:07 得分 0

还是转回来吧。Top

25 楼knf(CTO-首席打字员)回复于 2001-11-20 20:33:25 得分 0

这篇贴子转来转去都到了csdn的首页了,呵呵Top

26 楼wx_zzm()回复于 2001-11-22 21:15:25 得分 30

试试下面的代码,读取硬盘系列号的,我在VC6下调试通过。  
   
  void   ReadIDE()  
  {  
        int       al;  
        int       i;  
        WORD     pw[256];  
        char   sn[21];  
   
   
        while((al=_inp(0x1F7))>=0x80)   ;  
        _outp(0x1F6,0xA0);  
        al=WaitIde();  
        if((al&0x50)!=0x50)   return;  
   
        _outp(0x1F6,0xA0);  
        _outp(0x1F7,0xEC);  
        al=WaitIde();  
        if((al&0x58)!=0x58)   return;  
   
        for(i=0;i<   256;i++)    
              pw[i]=_inpw(0x1F0);  
   
        for(i=10;i<20;i++)  
        {  
          sn[(i-10)*2+0]=(char)(pw[i]>>8);  
          sn[(i-10)*2+1]=(char)pw[i];  
        }  
        sn[20]=0;  
       
  }Top

27 楼wx_zzm()回复于 2001-11-23 12:14:15 得分 0

补充一下:  
  上面的WaitIde   即while((al=_inp(0x1F7))>=0x80)   ;  
      Top

28 楼knf(CTO-首席打字员)回复于 2001-11-23 12:32:52 得分 0

我看不懂:(Top

29 楼yxgsb(浪子小管)回复于 2001-11-23 12:57:03 得分 10

机器底层信息最好用汇编解决,我推荐一个办法:你知道,很多主板刷新程序如AworD   Flash都能读出主板序列号,你找一个AworD   Flash程序,然后反汇编,到http://asm.yeah.net下一个EXE2ASM程序,再解读程序看其中的办法!!!!Top

30 楼ggyy(带着一堆光棍找朋友!)回复于 2001-11-23 12:59:55 得分 10

在我们编写的程序中常常要和硬件打交道,那么如何在程序中确定系统中是否有该   设备,它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需   简单地利用几个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。(西安 杨洪辰)  
   
  Top

31 楼ggyy(带着一堆光棍找朋友!)回复于 2001-11-23 13:00:31 得分 10

一、以前的DOS版要读、写、格式化第0轨的第1个磁区,程式大致如下:  
   
  char   buffer[512];  
   
  reg.x.dx=0   ;   /*   for   drive   A   *  
  reg.x.cx=0x0001   /*   for   boot   sector   */  
  reg.x.bx=FP_OFF(buffer);  
  sreg.es=FP_SEG(buffer);  
  resg.x.ax=0x0201;   /*   02   for   Read,   03   for   Write   ,05   for   Format   */  
  int86x(0x13,&reg;,&reg;,&sreg);  
   
  那麽在windows   下转换为呼叫   DeviceIoControl   以便格式化、读取、写入该磁轨,DIOC_REGISTERS   这struct   在套上   DOS   下   Int21对HDD或FDD   的各项参数如要格式化是Int21也是有,   但Windows下也另有提供。  
   
  l#pragma   pack(push,   1)  
  struct   DIOC_REGISTERS   {  
  DWORD   reg_EBX;  
  DWORD   reg_EDX;  
  DWORD   reg_ECX;  
  DWORD   reg_EAX;  
  DWORD   reg_EDI;  
  DWORD   reg_ESI;  
  DWORD   reg_Flags;  
  };  
  #pragma   pack(pop)  
   
  sDiskImageInfo->hDevice   =   ::CreateFile("\\\\.\\vwin32",   0,   0,   NULL,   0,  
  FILE_FLAG_DELETE_ON_CLOSE,   NULL);  
  if(   sDiskImageInfo->hDevice   ==   INVALID_HANDLE_VALUE)  
  bRunNext   =   false;  
   
  //   Reset   Floppy   Disk  
  reg.reg_EBX   =   0;  
  reg.reg_EAX   =   0x0000;   //   IOCTL   for   block   devices  
  reg.reg_EDX   =   sDiskImageInfo->Driver;  
  reg.reg_EDI   =   0;   reg.reg_ESI=   0;  
  reg.reg_Flags   =   0x0001;   //   assume   error   (carry   flag   is   set)  
  dwResult   =   ::DeviceIoControl(   sDiskImageInfo->hDevice,  
  VWIN32_DIOC_DOS_INT13,  
  &reg;,   sizeof(DIOC_REGISTERS),   &reg;,  
  sizeof(DIOC_REGISTERS),   &cb,   0);  
   
  //   Seek   Floppy  
  reg.reg_EBX   =   0;  
  reg.reg_EAX   =   0x0C00;   //   IOCTL   for   block   devices  
  reg.reg_ECX   =   (   sDiskImageInfo->nC   <<   8)   |   sDiskImageInfo->nS;  
  reg.reg_EDX   =   (   sDiskImageInfo->nH   <<   8)   |   sDiskImageInfo->Driver;  
  reg.reg_EDI   =   0;  
  reg.reg_ESI=   0;  
  reg.reg_Flags   =   0x0001;   //   assume   error   (carry   flag   is   set)  
  dwResult   =   ::DeviceIoControl(   sDiskImageInfo->hDevice,  
  VWIN32_DIOC_DOS_INT13,  
  &reg;,   sizeof(DIOC_REGISTERS),   &reg;,  
  sizeof(DIOC_REGISTERS),   &cb,   0);  
   
  //   Read   Floppy  
  R_CreateDiskImageFile:  
  reg.reg_EBX   =   0;  
  reg.reg_EAX   =   0x0200   |   0x01;   //   IOCTL   for   block   devices  
  reg.reg_ECX   =   (   sDiskImageInfo->nC   <<   8)   |   sDiskImageInfo->nS;  
  reg.reg_EDX   =   (   sDiskImageInfo->nH   <<   8)   |   sDiskImageInfo->Driver;  
  reg.reg_EBX   =   (DWORD)   &m_Buf;  
  reg.reg_EDI   =   0;  
  reg.reg_ESI=   0;  
  reg.reg_Flags   =   0x0001;   //   assume   error   (carry   flag   is   set)  
  dwResult   =   ::DeviceIoControl(   hDevice,   VWIN32_DIOC_DOS_INT13,  
  &reg;,   sizeof(DIOC_REGISTERS),   &reg;,  
  sizeof(DIOC_REGISTERS),   &cb,   0);  
  if   (!dwResult   ||   (reg.reg_Flags   &   0x0001))  
  {  
  }  
   
  Top

32 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-23 17:50:25 得分 0

各位老大!醒醒!!上面的程序基本上没有能在win2000下运行的。M$早就把这些底层的东西封起来了。我现在用C#中的ManagementClass好像可以找到。或者用sdk的WMI接口也可以。哪位用C#试验一下?Top

33 楼zshuc(小巧的PE)回复于 2001-11-26 16:47:26 得分 0

作个记号!Top

34 楼gloom(苍狗白云)回复于 2002-01-18 21:25:12 得分 0

关注Top

35 楼fenglingdu(风陵渡)回复于 2002-01-19 01:14:27 得分 0

新手学习....Top

36 楼actinia(海葵)回复于 2002-01-19 01:43:39 得分 0

呵呵,我也学学,不过好象没有真正切入主题耶!Top

37 楼Adayuer(饭碗饭碗饭碗你在哪里?)回复于 2002-01-19 04:07:44 得分 0

俺也关注Top

38 楼fiveyes(天才的剽窃如羚羊挂角无迹可寻)回复于 2002-01-19 09:03:58 得分 0

咦,主板这玩意那么多厂商和芯片组,他们也遵循一个统一的标准来在ROM中保留一个唯一的编号吗?那么这个标准是什么呢?有没有这么个标准呢?Top

39 楼luo73(梦中编程)回复于 2002-02-22 10:19:53 得分 0

关注  
  Top

40 楼xiao_niao(小鸟)回复于 2002-02-22 13:59:49 得分 50

http://www.csdn.net/expert/topic/486/486908.xmlTop

相关问题

  • SQLSERVER2000中如何存取图象,在使用BCB编写的程序中如何读取,最好有源码
  • 菜鸟求读取QQwry.bat的源码
  • bcb源码下载????
  • 怎么用汇编读取主板芯片信息???
  • 请教读取颜色RGB值的源码及实现方法?
  • 求用directx读取.x文件源码,急!
  • c#读取远程XML,并显示。(新手救源码)
  • DELPHI 下如何读取主板的序列号?
  • 求win2003下读取硬盘序列号的Delphi源码
  • 高分求获取主板、BIOS系列号源码?

关键词

  • .net
  • c#
  • c++
  • win32
  • 内存
  • 主板
  • 检测
  • 控件
  • 型号
  • 硬盘

得分解答快速导航

  • 帖主:pms
  • wyb_star
  • wyb_star
  • cobi
  • juqiang
  • juqiang
  • juqiang
  • wx_zzm
  • yxgsb
  • ggyy
  • ggyy
  • xiao_niao

相关链接

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

广告也精彩

反馈

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