function GetHDSerialNumber: LongInt;
{$IFDEF WIN32}
var
  pdw : pDWord;
  mc, fl : dword;
{$ENDIF}
begin
  {$IfDef WIN32}
  New(pdw);
  GetVolumeInformation(nil,nil,0,pdw,mc,fl,nil,0);
  Result := pdw^;
  dispose(pdw);
  {$ELSE}
  Result := GetWinFlags;
  {$ENDIF}
end;

解决方案 »

  1.   

    所以说呢,取CPU的序列号更好,除了INTEL和AMD,基本上没了其它牌子,这样代码运行起来出错的可能性几乎没有
      

  2.   

    如何取CPU的呢?不过三星的硬盘毕竟不多
      

  3.   

    關注這個問題,Windows API沒找到這方面的函數,是不是需要寫中斷取得?
    我找到的程序基本上都是在DOS下RUN.不清楚在windows9X与2000下能否實現.
      

  4.   

    http://www.csdn.net/expert/topic/768/768894.xml?temp=.7499506
      

  5.   

    unit MBCPUID;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,DsgnIntf;type
      TMBCPUID = class(TComponent)
      private
       FAbout  : string;
        FMBinfo: string;
        FCPUID: string;  protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner:TComponent); override;
        procedure Loaded; override;
        destructor Destroy; override;
        procedure ShowAbout;
      published  property About: string read FAbout write FAbout stored False;
      property GetMBinfo :string read FMBinfo;
      property GetCPUID :string read FCPUID ;
      { Published declarations }
      end;procedure Register;implementation
      const
     ID_BIT = $200000;   // EFLAGS ID bit
    type
     TCPUID = array[1..4] of Longint;
         { Private declarations }
    type
      TAboutProperty = class(TPropertyEditor)
      public
        procedure Edit; override;
        function GetAttributes: TPropertyAttributes; override;
        function GetValue:string; override;
      end;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 GetCPUIDSN : 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;  procedure Register;
    begin
      RegisterComponents('Samples', [TMBCPUID]);
      RegisterPropertyEditor (TypeInfo (String), TMBCPUID,
                             'About', TAboutProperty);
      end;
    constructor TMBCPUID.Create(AOwner:TComponent);
    begin
      inherited Create(AOwner);end;procedure TMBCPUID.Loaded;
    var
     CPUID : TCPUID;
     mbinf:Pchar;
     i:integer;
     begin
      inherited Loaded; { always call the inherited Loaded first! }
      FAbout:='读主板编号,CPUID控件,张阳制作,必属精品';
     if IsCPUID_Available then  CPUID:=GetCPUIDSN else begin
    //早期CPU无ID
     CPUID[1] := 1528;
     CPUID[4] := 24682468;
    end;  
    FCPUID:=IntToHex((CPUID[1]+CPUID[4]),8);
    mbinf:=Pchar(Ptr($FEC71));
    for i:=11 to  LENGTH(string(mbinf)) do
    FMBinfo:=FMBinfo+mbinf[i];  //次编号前十一位是Bios升级日期,舍掉end;destructor TMBCPUID.Destroy;
    begin
      inherited Destroy;
    end;
    procedure TAboutProperty.Edit;
    begin
      TMBCPUID(GetComponent(0)).ShowAbout;
    end;
    function TAboutProperty.GetAttributes: TPropertyAttributes;
    begin
      GetAttributes := [paDialog, paReadOnly];
    end;function TAboutProperty.GetValue: String;
    begin
      GetValue := '(About)';
    end;
     procedure TMBCPUID.ShowAbout;
    var
      msg : string;
    const
      cr = chr (13);
    begin
      msg  := '读主板编号,CPUID控件' + cr + 'FOR D4,D5,D6,CB4,CB5' + cr;
      msg  := msg + 'WIN9X/ME/NT/2K/XP' + cr + cr;
      msg  := msg + 'Copyright 2001 MoonSoft' + cr+'   张阳制作,必属精品!' + cr;
      msg  := msg + 'E-mail:[email protected]' + cr;
      Application.Messagebox(pchar(msg ),'版本提示(最终版)',MB_OK );
    end;end.
      

  6.   

    DLL带Delphi范例
    http://www.applevb.com/lib/diskio.rar
    VC源码
    http://www.applevb.com/DiskID.rar
      

  7.   

    unit main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IoCtl,
      StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure DirectIdentify;
        procedure PrintIdSectorInfo(IdSector: TIdSector);
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DirectIdentify;
    var
      hDevice: THandle;
      rc: DWORD;
      nIdSectorSize: LongInt;
      aIdBuffer: array[0..IDENTIFY_BUFFER_SIZE - 1] of Byte;
      IdSector: TIdSector absolute aIdBuffer;
    begin
      FillChar(aIdBuffer, SizeOf(aIdBuffer), #0);
      hDevice := GetPhysicalDriveHandle(0, GENERIC_READ or GENERIC_WRITE);
    {$IFDEF debug}
      OutputDebugString(PChar('GetPhysicalDriveHandle return ' + IntToHex(hDevice, 8)));
    {$ENDIF}
      OutputDebugString(PChar('GetPhysicalDriveHandle return ' + IntToHex(hDevice, 8)));  if hDevice = INVALID_HANDLE_VALUE then
      begin
        rc := GetLastError;
    //    WriteLn('Error on GetPhysicalDeviceHandle (errcode=', rc, '): ', SysErrorMessage(rc));
        Memo1.Lines.Add('Error on GetPhysicalDeviceHandle (errcode=' + SysErrorMessage(rc));
      end
      else
      try
        if not SmartIdentifyDirect(hDevice, 0, IDE_ID_FUNCTION, IdSector, nIdSectorSize) then
        begin
          rc := GetLastError;
          Memo1.Lines.Add('SMART Identify command failed (errcode=' + string(rc));
    //      WriteLn('SMART Identify command failed (errcode=', rc, '):');
    //      WriteLn(SysErrorMessage(rc));
          Memo1.Lines.Add(SysErrorMessage(rc));
        end
        else
        begin
    //      WriteLn('SMART IDENTIFY command is completed successfully.');
          Memo1.Lines.Add('Smart Identift command is completed successfully.');
          PrintIdSectorInfo(IdSector);
    //      WriteLn;
          Memo1.Lines.Add('');
        end;
      finally
        CloseHandle(hDevice);
      end;
    end;procedure TForm1.PrintIdSectorInfo(IdSector: TIdSector);
    var
      szOutBuffer: array[0..40] of Char;
    begin
    {$IFDEF debug}
      OutputDebugString('PrintIdSectorInfo');
    {$ENDIF}  with IdSector do
      begin
        ChangeByteOrder(sModelNumber, SizeOf(sModelNumber)); // Change the WORD array to a BYTE array
        szOutBuffer[SizeOf(sModelNumber)] := #0;
        StrLCopy(szOutBuffer, sModelNumber, SizeOf(sModelNumber));
    //    WriteLn('Model number: ', szOutBuffer);
        Memo1.Lines.Add('Model number:' + szOutBuffer);
        ChangeByteOrder(sFirmwareRev, SizeOf(sFirmwareRev));
        szOutBuffer[SizeOf(sFirmwareRev)] := #0;
        StrLCopy(szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev));
    //    WriteLn('Firmware rev: ', szOutBuffer);
        Memo1.Lines.Add('Firmware rev: ' + szOutBuffer);    ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
        szOutBuffer[SizeOf(sSerialNumber)] := #0;
        StrLCopy(szOutBuffer, sSerialNumber, SizeOf(sSerialNumber));
    //    WriteLn('Serial number: ', szOutBuffer);
        Memo1.Lines.Add('Serial number: ' + szOutBuffer);
      end;
    //  WriteLn;
        Memo1.Lines.Add('');
    {$IFDEF debug}
      OutputDebugString('PrintIdSectorInfo end');
    {$ENDIF}
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add('-------------------------Get Hard Disk Infomation--------------------------');
      DirectIdentify;
    end;end.
      

  8.   

    需要有Smartvsd.vxd放到System目录下,而Windows 2000以后的版本已经带了
      

  9.   

    嘻嘻嘻-----------用ASM嘛----------------------------
    来点简单的;