如何提取cpu编号及内存编号???

解决方案 »

  1.   

    使用汇编:指令cpuid.通过返回值可以知道CPU厂商。编号之类。。
      

  2.   

    提取cpu编号unit Main;interfaceuses
    Windows,
    Messages,
    SysUtils,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs,
    ExtCtrls,
    StdCtrls,
    Buttons;type
    TDemoForm = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    GetButton: TBitBtn;
    CloseButton: TBitBtn;
    Bevel1: TBevel;
    Label5: TLabel;
    FLabel: TLabel;
    MLabel: TLabel;
    PLabel: TLabel;
    SLabel: TLabel;
    Pvalue: TLabel;
    Fvalue: TLabel;
    Mvalue: TLabel;
    Svalue: TLabel;
    procedure GetButtonClick(Sender: TObject);
    end;var
    DemoForm: TDemoForm;implementation{$R *.DFM}const
    ID_BIT = $200000; // EFLAGS ID bit
    type
    TCPUID = array[1..4] of Longint;
    TVendor = array [0..11] of char;function IsCPUID_Available : Boolean; register;
    asm
    PUSHFD {direct access to flags no possible, only via stack}
    POP EAX {flags to EAX}
    MOV EDX,EAX {save current flags}
    XOR EAX,ID_BIT {not ID bit}
    PUSH EAX {onto stack}
    POPFD {from stack to flags, with not ID bit}
    PUSHFD {back to stack}
    POP EAX {get back to EAX}
    XOR EAX,EDX {check if ID bit affected}
    JZ @exit {no, CPUID not availavle}
    MOV AL,True {Result=True}
    @exit:
    end;function GetCPUID : TCPUID; assembler; register;
    asm
    PUSH EBX {Save affected register}
    PUSH EDI
    MOV EDI,EAX {@Resukt}
    MOV EAX,1
    DW $A20F {CPUID Command}
    STOSD {CPUID[1]}
    MOV EAX,EBX
    STOSD {CPUID[2]}
    MOV EAX,ECX
    STOSD {CPUID[3]}
    MOV EAX,EDX
    STOSD {CPUID[4]}
    POP EDI {Restore registers}
    POP EBX
    end;function GetCPUVendor : TVendor; assembler; register;
    asm
    PUSH EBX {Save affected register}
    PUSH EDI
    MOV EDI,EAX {@Result (TVendor)}
    MOV EAX,0
    DW $A20F {CPUID Command}
    MOV EAX,EBX
    XCHG EBX,ECX {save ECX result}
    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 {Restore registers}
    POP EBX
    end;procedure TDemoForm.GetButtonClick(Sender: TObject);
    var
    CPUID : TCPUID;
    I : Integer;
    S : TVendor;
    begin
    for I := Low(CPUID) to High(CPUID) do CPUID[I] := -1;
    if IsCPUID_Available then begin
    CPUID := GetCPUID;
    Label1.Caption := 'CPUID[1] = ' + IntToHex(CPUID[1],8);
    Label2.Caption := 'CPUID[2] = ' + IntToHex(CPUID[2],8);
    Label3.Caption := 'CPUID[3] = ' + IntToHex(CPUID[3],8);
    Label4.Caption := 'CPUID[4] = ' + IntToHex(CPUID[4],8);
    Pvalue.Caption := IntToStr(CPUID[1] shr 12 and 3);
    Fvalue.Caption := IntToStr(CPUID[1] shr 8 and $f);
    Mvalue.Caption := IntToStr(CPUID[1] shr 4 and $f);
    Svalue.Caption := IntToStr(CPUID[1] and $f);
    S := GetCPUVendor;
    Label5.Caption := 'Vendor: ' + S; end
    else begin
    Label5.Caption := 'CPUID not available';
    end;
    end;end.
      

  3.   

    http://delphi.e-0631.cn
     DELPHI常用技巧集 -> 1组 -> 7.获取CPU ID