Delphi下获取CPU相关信息,如CPU名字以及厂商等.
用什么函数,怎么实现?

解决方案 »

  1.   

    一、获取CPU厂家信息Const
      CPUVendorIDs :array[0..5] of string = ('GenuineIntel','UMC UMC UMC','AuthenticAMD','CyrixInstead','NexGenDriven','CentaurHauls');
      //将CPU厂家信息转换成字串形式
      CPUVendors :array[0..5] of string = ('Intel','UMC','AMD','Cyrix','NexGen','CentaurHauls');type TVendor = array [0..11] of char;// 获取CPU厂家信息,返回值为TVendor类型
    function GetCPUVendor : TVendor; assembler; register;
    asm
      PUSH    EBX 
      PUSH    EDI
      MOV     EDI,EAX
      MOV     EAX,0
      DW      $A20F  //CPUID指令
      MOV     EAX,EBX
      XCHG      EBX,ECX
      MOV      ECX,4
    @1:
      STOSB
      SHR     EAX,8
      LOOP    @1
      MOV     EAX,EDX
      MOV      ECX,4
    @2:
      STOSB
      SHR     EAX,8
      LOOP    @2
      MOV     EAX,EBX
      MOV      ECX,4
    @3:
      STOSB
      SHR     EAX,8
      LOOP    @3
      POP     EDI 
      POP     EBX
    end;
    调用方式: 
    var
      Vendor: string;
      VendorID, I: integer;
    begin
      Vendor := GetCPUVendor;
      for i := 0 to High(CPUVendorIDs) do
      begin
       If Vendor = CPUVendorIDs[I] then
       begin
         Vendor := CPUVendors[I];  //把厂家信息精简一下,好看多了
         VendorID := i;
         break;
       end;
      end;
    end;
       二、获取CPU类型信息  
    const ID_BIT=$200000; //CPU ID 位标记
    type TCPUID=array[1..4] of Longint;//判断CPUID信息是否有效
    function IsCPUIDAvailable : Boolean; register; 
    asm
      PUSHFD   //不允许直接存取,必须通过堆栈
      POP     EAX
      MOV     EDX,EAX
      XOR     EAX,ID_BIT
      PUSH    EAX
      POPFD
      PUSHFD
      POP     EAX
      XOR     EAX,EDX  //检测ID位是否受影响
      JZ      @exit    //CPUID无效
      MOV     AL,True  //CPUID无效
    @exit:
    end;//获取CPUID信息,返回值为TCPUID类型
    function GetCPUID : TCPUID; assembler; register;
    asm
      PUSH    EBX 
      PUSH    EDI
      MOV     EDI,EAX
      MOV     EAX,1
      DW      $A20F  //CPUID指令
      STOSD          //CPUID[1]
      MOV     EAX,EBX
      STOSD          //CPUID[2]
      MOV     EAX,ECX
      STOSD          //CPUID[3]
      MOV     EAX,EDX
      STOSD          //CPUID[4]
      POP     EDI 
      POP     EBX
    end;
    具体使用方法: 
    const
      CPUSubModels: array[0..4] of string = ('Primary','OverDrive','Secondary','Reserved','Not Detected');
    var
      CPUID: TCPUID;
      SubModel: string;
      SubModelID, Family, Model, Stepping: Integer;
    begin
      //如果CPUID信息有效
      if IsCPUIDAvailable then
      begin
        fillchar(CPUID, sizeof(CPUID), -1);
        CPUID := GetCPUID;
        SubModelID := CPUID[1] shr 12 and 3;
        Family := CPUID[1] shr 8  and $F;
        Model  := CPUID[1] shr 4  and $F;
        Stepping:= CPUID[1] and $F;
        if SubModelID < 4 then
          SubModel := CPUSubModels[SubModelID]
        else
          SubModel := CPUSubModels[4];
      end;
    end;
      

  2.   

    http://blog.csdn.net/masterjames/archive/2008/09/24/2972006.aspx
    完整的UNIT