下面的代码怎么生成了好几个啊?我想写个注册码,在生成的字串上再变一下,写个注册的程序,应该怎么写啊?有没现成的代码,被人破了没关系的var
  I   : Integer;
  sGUID  : string;
  TmpGUID: TGUID;
begin
  for I := 0 to 10 do
  begin
    if CoCreateGUID(TmpGUID) = S_OK then
      sGUID := GUIDToString(TmpGUID)
    else
      ShowMessage('Create GUID error!');
    ShowMessage(sGUID);
  end;end;

解决方案 »

  1.   

    var
      sGUID  : string;
      TmpGUID: TGUID;
    begin
      if CoCreateGUID(TmpGUID) = S_OK then
      begin
        sGUID := GUIDToString(TmpGUID)
        ShowMessage(sGUID);
      end;
    end;
      

  2.   

    对计算机的cpu序列号,主硬盘序列号等进行加密.
      

  3.   

    谢谢,生成的GUID每次启动时都不一样,怎么才能做到一机一码?
      

  4.   

    计算机的MAC是唯一的
    你可以获取MAC
      

  5.   

    获取CPU,硬盘,网卡等序列号进行演算.
      

  6.   

    2楼GUID的办法不行,不能与计算机硬件对应。
    简单好用的办法就是用网卡序列号,复杂点的就是网卡+CPU+硬盘,其实对于一般系统来说,用MAC地址识别就足够了
      

  7.   

    在CSDN上找到这个得到硬盘序列号的,不知道在SCSI的硬盘上能不能行,谁有SCSI的硬盘帮忙试一下啊?
    function   GetIdeDiskSerialNumber:   string;   
      type   
          TSrbIoControl   =   packed   record   
              HeaderLength:   ULONG;   
              Signature:   array[0..7]   of   Char;   
              Timeout:   ULONG;   
              ControlCode:   ULONG;   
              ReturnCode:   ULONG;   
              Length:   ULONG;   
          end;   
          SRB_IO_CONTROL   =   TSrbIoControl;   
          PSrbIoControl   =   ^TSrbIoControl;   
          TIDERegs   =   packed   record   
              bFeaturesReg:   Byte;   //   Used   for   specifying   SMART   "commands".   
              bSectorCountReg:   Byte;   //   IDE   sector   count   register   
              bSectorNumberReg:   Byte;   //   IDE   sector   number   register   
              bCylLowReg:   Byte;   //   IDE   low   order   cylinder   value   
              bCylHighReg:   Byte;   //   IDE   high   order   cylinder   value   
              bDriveHeadReg:   Byte;   //   IDE   drive/head   register   
              bCommandReg:   Byte;   //   Actual   IDE   command.   
              bReserved:   Byte;   //   reserved   for   future   use.     Must   be   zero.   
          end;   
          IDEREGS   =   TIDERegs;   
          PIDERegs   =   ^TIDERegs;   
          TSendCmdInParams   =   packed   record   
              cBufferSize:   DWORD;   //   Buffer   size   in   bytes   
              irDriveRegs:   TIDERegs;   //   Structure   with   drive   register   values.   
              bDriveNumber:   Byte;   //   Physical   drive   number   to   send   command   to   (0,1,2,3).   
              bReserved:   array[0..2]   of   Byte;   //   Reserved   for   future   expansion.   
              dwReserved:   array[0..3]   of   DWORD;   //   For   future   use.   
              bBuffer:   array[0..0]   of   Byte;   //   Input   buffer.   
          end;   
          SENDCMDINPARAMS   =   TSendCmdInParams;   
          PSendCmdInParams   =   ^TSendCmdInParams;   
          TIdSector   =   packed   record   
              wGenConfig:   Word;   
              wNumCyls:   Word;   
              wReserved:   Word;   
              wNumHeads:   Word;   
              wBytesPerTrack:   Word;   
              wBytesPerSector:   Word;   
              wSectorsPerTrack:   Word;   
              wVendorUnique:   array[0..2]   of   Word;   
              sSerialNumber:   array[0..19]   of   Char;   
              wBufferType:   Word;   
              wBufferSize:   Word;   
              wECCSize:   Word;   
              sFirmwareRev:   array[0..7]   of   Char;   
              sModelNumber:   array[0..39]   of   Char;   
              wMoreVendorUnique:   Word;   
              wDoubleWordIO:   Word;   
              wCapabilities:   Word;   
              wReserved1:   Word;   
              wPIOTiming:   Word;   
              wDMATiming:   Word;   
              wBS:   Word;   
              wNumCurrentCyls:   Word;   
              wNumCurrentHeads:   Word;   
              wNumCurrentSectorsPerTrack:   Word;   
              ulCurrentSectorCapacity:   ULONG;   
              wMultSectorStuff:   Word;   
              ulTotalAddressableSectors:   ULONG;   
              wSingleWordDMA:   Word;   
              wMultiWordDMA:   Word;   
              bReserved:   array[0..127]   of   Byte;   
          end;   
          PIdSector   =   ^TIdSector;   
      const   
          IDE_ID_FUNCTION   =   $EC;   
          IDENTIFY_BUFFER_SIZE   =   512;   
          DFP_RECEIVE_DRIVE_DATA   =   $0007C088;   
          IOCTL_SCSI_MINIPORT   =   $0004D008;   
          IOCTL_SCSI_MINIPORT_IDENTIFY   =   $001B0501;   
          DataSize   =   sizeof(TSendCmdInParams)   -   1   +   IDENTIFY_BUFFER_SIZE;   
          BufferSize   =   SizeOf(SRB_IO_CONTROL)   +   DataSize;   
          W9xBufferSize   =   IDENTIFY_BUFFER_SIZE   +   16;   
      var   
          hDevice:   THandle;   
          cbBytesReturned:   DWORD;   
          pInData:   PSendCmdInParams;   
          pOutData:   Pointer;   //   PSendCmdInParams;   
          Buffer:   array[0..BufferSize   -   1]   of   Byte;   
          srbControl:   TSrbIoControl   absolute   Buffer;   
          procedure   ChangeByteOrder(var   Data;   Size:   Integer);   
          var   ptr:   PChar;   
              i:   Integer;   
              c:   Char;   
          begin   
              ptr   :=   @Data;   
              for   i   :=   0   to   (Size   shr   1)   -   1   do   
              begin   
                  c   :=   ptr^;   
                  ptr^   :=   (ptr   +   1)^;   
                  (ptr   +   1)^   :=   c;   
                  Inc(ptr,   2);   
              end;   
          end;   
      begin   
          Result   :=   '';   
          FillChar(Buffer,   BufferSize,   #0);   
          if   Win32Platform   =   VER_PLATFORM_WIN32_NT   then   
          begin   //   Windows   NT,   Windows   2000   
                  //   Get   SCSI   port   handle   
              hDevice   :=   CreateFile('\\.\Scsi0:',   GENERIC_READ   or   GENERIC_WRITE,   
                  FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,   0,   0);   
              if   hDevice   =   INVALID_HANDLE_VALUE   then   Exit;   
              try   
                  srbControl.HeaderLength   :=   SizeOf(SRB_IO_CONTROL);   
                  System.Move('SCSIDISK',   srbControl.Signature,   8);   
                  srbControl.Timeout   :=   2;   
                  srbControl.Length   :=   DataSize;   
                  srbControl.ControlCode   :=   IOCTL_SCSI_MINIPORT_IDENTIFY;   
                  pInData   :=   PSendCmdInParams(PChar(@Buffer)   +   SizeOf(SRB_IO_CONTROL));   
                  pOutData   :=   pInData;   
                  with   pInData^   do   
                  begin   
                      cBufferSize   :=   IDENTIFY_BUFFER_SIZE;   
                      bDriveNumber   :=   0;   
                      with   irDriveRegs   do   
                      begin   
                          bFeaturesReg   :=   0;   
                          bSectorCountReg   :=   1;   
                          bSectorNumberReg   :=   1;   
                          bCylLowReg   :=   0;   
                          bCylHighReg   :=   0;   
                          bDriveHeadReg   :=   $A0;   
                          bCommandReg   :=   IDE_ID_FUNCTION;   
                      end;   
                  end;   
                  if   not   DeviceIoControl(hDevice,   IOCTL_SCSI_MINIPORT,   @Buffer,   BufferSize,   @Buffer,   BufferSize,   cbBytesReturned,   nil)   then   Exit;   
              finally   
                  CloseHandle(hDevice);   
              end;   
          end   
          else   
          begin   //   Windows   95   OSR2,   Windows   98   
              hDevice   :=   CreateFile('\\.\SMARTVSD',   0,   0,   nil,   CREATE_NEW,   0,   0);   
              if   hDevice   =   INVALID_HANDLE_VALUE   then   Exit;   
              try   
                  pInData   :=   PSendCmdInParams(@Buffer);   
                  pOutData   :=   PChar(@pInData^.bBuffer);   
                  with   pInData^   do   
                  begin   
                      cBufferSize   :=   IDENTIFY_BUFFER_SIZE;   
                      bDriveNumber   :=   0;   
                      with   irDriveRegs   do   
                      begin   
                          bFeaturesReg   :=   0;   
                          bSectorCountReg   :=   1;   
                          bSectorNumberReg   :=   1;   
                          bCylLowReg   :=   0;   
                          bCylHighReg   :=   0;   
                          bDriveHeadReg   :=   $A0;   
                          bCommandReg   :=   IDE_ID_FUNCTION;   
                      end;   
                  end;   
                  if   not   DeviceIoControl(hDevice,   DFP_RECEIVE_DRIVE_DATA,   pInData,   SizeOf(TSendCmdInParams)   -   1,   pOutData,   W9xBufferSize,   cbBytesReturned,   nil)   then   Exit;   
              finally   
                  CloseHandle(hDevice);   
              end;   
          end;   
          with   PIdSector(PChar(pOutData)   +   16)^   do   
          begin   
              ChangeByteOrder(sSerialNumber,   SizeOf(sSerialNumber));   
              SetString(Result,   sSerialNumber,   SizeOf(sSerialNumber));   
          end;   
      end; 
     
      

  8.   

    procedure   TForm_Main.Button_GetClick(Sender:   TObject);   
      begin   
          Edit_HardDiskNumber.Text   :=   GetIdeDiskSerialNumber;   
      end;   
      end.
      

  9.   

    可以对mac地址加密 再加上6位的随机数 
      

  10.   

    //获取计算机第一块网卡MAC地址
    function GetFirstMac: string;
    var
      Strings: TStringList;
      I, j: Integer;
    begin
      Result := '';
      Strings := TStringList.Create;
      try
        NBGetMac(Strings);
        for I := 0 to Strings.Count - 1 do
        begin
          for j := 1 to Length(Strings.Strings[I]) do
            if (Strings.Strings[I][j] <> '0') and
              (Strings.Strings[I][j] <> '-') then
            begin
              Result := Strings.Strings[I];
              Break;
            end;
          if Result <> '' then Break;
        end;
      finally
        Strings.Free;
      end;
    end;
      

  11.   

    硬盘容易坏,还是读CPU吧,呵呵
      

  12.   

    unit CPUID;interface
     
    uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls;
    type
      TMyCPU = class
        class function GetCpuIDStr: string;
      end;
     implementation 
    type
      TCPUID  = array[1..4] of Longint;
      TVendor = array [0..11] of char;
     
    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; 
     
    class function TMyCPU.GetCpuIDStr: string;
    var
      CPUID : TCPUID; 
      I     : Integer; 
      S     : TVendor;
    begin
      for I := Low(CPUID) to High(CPUID)  do CPUID[I] := -1;
      CPUID := GetCPUID;
      Result := 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);
    end;end.
      

  13.   

    to17楼,如果是双CPU,那就麻烦了
      

  14.   

    考虑用硬盘序列和网卡的MAC地址组合加密,因为感觉现在的CPU双核考虑比较麻烦