1.变量定义
const CKey : TKey = ( $A7,$33,$6B,$BF,$C8,$28,$86,$D2,$72,$EE,$D8,$36,$28,$69,$FC,$9B ); var MachineKey : TKey; MachineModifier : LongInt;
2.initialization部分做初始运算
MachineKey := CKey; //这里是一个random机器码 MachineModifier := ABS(CreateMachineID([midUser, midSystem, {midNetwork,} midDrives])); //这里通过登陆用户名、操作系统、硬盘序列号,创建一个修饰符,用于对机器码修饰 ApplyModifierToKeyPrim( MachineModifier , MachineKey , SizeOf(MachineKey) ); //这里就是用上一步生成的修饰符对机器码做进一步的运算,生成一个最终的机器码,仍然保存在MachineKey中。
3.计算注册码
var AMachineKey:string; ACode : TCode ; ARelaseCode:string; begin AMachineKey:=BufferToHex(MachineKey,SizeOf(MachineKey));//这里将机器码转为字符串 InitSerialNumberCode( MachineKey , 1122334455 , 0 , ACode );//这里用机器码MachineKey对序列号1122334455进行加密(注意这个1122334455是你要发给软件使用人的序列号,可以是任意一个整形数,将来要用这个来注册软件的),得到一个最终的注册码 ARelaseCode := BufferToHex( ACode , SizeOf(ACode) ); //最终的注册码转为字符串,将来软件注册时就要对比用户填写的注册码是否与这个注册码相符,相符就说明注册成功,如果不成功,就是注册失败。 end;
4.如果注册成功的话,就要把这个注册码和序列号保存起来,我选用注册表保存:
with TRegIniFile.Create do try RootKey := HKEY_LOCAL_MACHINE ; OpenKey( 'SOFTWARE\PRLSOFT', True ) ; WriteString( 'RegInfo','SMS_SnRegCode', RelaseCode ); WriteInteger( 'RegInfo','SMS_SerialNumber', 1122334455); finally Free; end;
5.在我们的软件中,就要从注册表中读取出这个注册码,然后与计算出来的注册码做对比,如果相等,就说明软件已经注册,如果失败,就说明软件未注册,我们可以做一些限制
const CKey : TKey = ( $A7,$33,$6B,$BF,$C8,$28,$86,$D2,$72,$EE,$D8,$36,$28,$69,$FC,$9B ); var MachineKey : TKey; MachineModifier : LongInt; AMachineKey:string; ACode : TCode ; ARelaseCode:string; AMyRelaseCode:string; ASerialNumber:Integer; {$R *.res} begin MachineKey := CKey; //这里是一个random机器码 MachineModifier := ABS(CreateMachineID([midUser, midSystem, {midNetwork,} midDrives])); //这里通过登陆用户名、操作系统、硬盘序列号,创建一个修饰符,用于对机器码修饰 ApplyModifierToKeyPrim( MachineModifier , MachineKey , SizeOf(MachineKey) ); //这里就是用上一步生成的修饰符对机器码做进一步的运算,生成一个最终的机器码,仍然保存在MachineKey中。 with TRegIniFile.Create do try RootKey := HKEY_LOCAL_MACHINE ; OpenKey( 'SOFTWARE\PRLSOFT',False ); AMyRelaseCode := ReadString( 'RegInfo' , 'SMS_SnRegCode' ,'' ); ASerialNumber := ReadInteger( 'RegInfo', 'SMS_SerialNumber',0); finally Free; end; MachineKey := CKey; MachineModifier := ABS(CreateMachineID([midUser, midSystem, {midNetwork,} midDrives])); ApplyModifierToKeyPrim( MachineModifier , MachineKey , SizeOf(MachineKey) ); AMachineKey:=BufferToHex(MachineKey,SizeOf(MachineKey)); InitSerialNumberCode( MachineKey , ASerialNumber , 0 , ACode ); ARelaseCode := BufferToHex( ACode , SizeOf(ACode) ); if ARelaseCode = AMyRelaseCode then //已经注册成功 ShowMessage('已经注册成功') else begin //未注册 ShowMessage('未注册'); Exit; end ; Application.Initialize; Application.MainFormOnTaskbar := True; Application.Title := '无线助理标准版'; Application.CreateForm(TDM, DM); ... Application.Run; end.