代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    PValue: TLabel;
    FValue: TLabel;
    MValue: TLabel;
    SValue: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;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 TForm1.Button1Click(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.

解决方案 »

  1.   

    我的两台机器的测试结果:
    机器1:
    GenuineIntel
    0000 0F27
    0001 080F
    0000 0400
    BFEB FBFF机器2:
    GenuineIntel
    0000 0686
    0000 0001
    0000 0000
    0383 F9FF
      

  2.   

    想测试一下这个代码在不同的CPU下、系统下的工作情况,还请大家一起来!!!
      

  3.   

    机器1是Win2000pro+SP4
    机器2是WinXPpro+SP1
      

  4.   

    这段代码我测试过,同一批次的CPU这4个号码相同。
    而且第三个号码不稳定,在同一台机子上会有两个不同的号码
      

  5.   

    cpuid对同一批的都一样,如果用来做版权保护没有什么用
      

  6.   

    GenuineIntel
    0000 0F12
    0001 0808
    0000 0000
    3FEB FBFF友情测试~~
      

  7.   

    >>>请问你是在什么情形下出现不稳定的呢?
    说错了,是第二个号码
    我原来的测试结果如下:2003-10-2          11:31:14
    计算机:11-KABM0OXE0586          用户:Administrator
    系统信息:5.1.2600.2.Service Pack 1
    CPU频率:2410MH     CPU型号:GenuineIntel      Level 15 Rev. 2.9
    CPUID1:00000F29
    CPUID2:00020809
    CPUID3:00004400
    CPUID4:BFEBFBFF
    硬盘序列号:
    C盘卷标:157000322
    BiosDate:04/30/03
    BiosName:Award 
    BiosVersion:Award Modular BIOS v6.00PG
    BiosSerial:04/30/2003-i875P-6A79BG02C-00
    BisoCopyright:Copyright (C) 1984-2003, Award Software, Inc.
    2003-10-2          11:31:17
    计算机:11-KABM0OXE0586          用户:Administrator
    系统信息:5.1.2600.2.Service Pack 1
    CPU频率:2410MH     CPU型号:GenuineIntel      Level 15 Rev. 2.9
    CPUID1:00000F29
    CPUID2:01020809
    CPUID3:00004400
    CPUID4:BFEBFBFF
    硬盘序列号:
    C盘卷标:157000322
    BiosDate:04/30/03
    BiosName:Award 
    BiosVersion:Award Modular BIOS v6.00PG
    BiosSerial:04/30/2003-i875P-6A79BG02C-00
    BisoCopyright:Copyright (C) 1984-2003, Award Software, Inc.
      

  8.   

    我有个源码在http://www.0mai.com/bbs/down_default.asp 
    http://www.0mai.com/bbs上有说明
      

  9.   

    fj218(洞庭风),
    如果是这样子的话,我根本不能拿这个来做用户认证。
    请问:有没有其他的一些办法,得到计算机的唯一ID?比如主板的ID?
    个人觉得象网卡、硬盘的一些ID不太好用,还是有不少机器都可能更换网卡和硬盘的。谢谢!!!
      

  10.   

    版主 用COMS_BIOS信息可满足要求!
    但在Win98和Win2000上实现不一样(要进入Ring0层)
    正尝试进入Ring0
    UP!
      

  11.   

    你要得到每台电脑都有一个唯一的号码不太现实,有少量的重复号码不影响你的用户认证。
    我是用的CPUID+硬盘序列号,但CPUID我是用的第一个和第四个号码。
      

  12.   

    CPU的,主版的ID都是可以相同的.而且同一型号的一个样
    硬盘的ID是唯一的通过CallGate在NT下进入Ring0读CMOS的BIOS不是问题,但是BIOS可以修改的,也不可靠的 fj218(洞庭风) 说得好:每台电脑都有一个唯一的号码不太现实所以有一定的可靠性就可以了
      

  13.   

    我现在也用CPU ID第一、第四个号码。有重复不是问题,只要同一个CPU,不管在什么情况下,读取得到的数都一样就行了。呵呵