Delphi - 软件注册的一个例子

利用主板序列号来注册的一个例子,希望对大家有帮助.
 
Unit RegObj;

Interface

Uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Forms;

Type
  TRegObj= Class
  Private
    FSerial: String; //主板序列号
    FKey: String; //密码
    FMaxTimes: Integer; //最大运行次数
    FCompany: String; //公司名称
    FEmail: String; //联系用的电子邮件
  Protected
    Procedure SetSerial; //取得主扳的序列号
    Procedure GetKey; //从用户序列号文件中读取序列号
    Function GetTimes: Integer; //从文件中读取程序的运行次数
    Function CheckKey: Boolean; //检查序列号和密码是否匹配的函数
  Public
    Constructor Create;
    Function Execute: Boolean; //运行对象方法
  Published
    Property Company: String Read FCompany Write FCompany;
    Property MaxTimes: Integer Read FMaxTimes Write FMaxTimes;
    Property Email: String Read FEmail Write FEmail;
  End;

Implementation

//TRegObj.

Constructor TRegObj.Create;
Begin
  Inherited;
End;

Function TRegObj.GetTimes: Integer;
Const
//用于存储运行次数的文件,开发人员可自定义或使用注册表存储运行次数
//起此名字用于迷惑破解者,使用前不要和系统的动态链接库同名
  Tmp= 'ispnet.dll';
Var
  Ch: Char;
  Dir: Array[ 0..255 ] Of Char;
  Fn: String;
  I: Integer;
  List: Tstrings;
Begin
//取得Windows系统的目录
  GetSystemDirectory( @Dir , 255 );
  For I := 0 To 255 Do
  Begin
    If Ord( Dir[ I ] )= 0 Then
      Break;
    Fn := Fn+ Dir[ I ];
  End;
  Fn := Fn+ '\'+ Tmp;
  Try
    List := TStringList.Create;
    If Not FileExists( Fn ) Then
      Ch := Chr( 1 )
    Else
    Begin
      List.LoadFromFile( Fn );
      Ch := List.Text[ 1 ];
      Ch := Chr( Ord( Ch )+ 1 );
    End;
    List.Text := Ch;
//存储运行次数
    List.SaveToFile( Fn );
    Result := Ord( Ch );
  Finally
    List.Free;
  End;
End;

Procedure TRegObj.SetSerial;
Begin
//取得主板的序列号
  FSerial := String( Pchar( Ptr( $FEC71 ) ) );
End;

//取得密码

Procedure TRegObj.GetKey;
Const
  Sn= 'Key.dat';
Var
  List: TStrings;
  Fn, Path: String;
Begin
  Path := ExtractFilePath( Application.ExeName );
  Fn := Path+ Sn;
  If Not FileExists( Fn ) Then
  Begin
    FKey := '';
    Exit;
  End;
  Try
    List := TStringList.Create;
    List.LoadFromFile( Fn );
    FKey := List.Values[ 'Key' ];
  Finally
    List.Free;
  End;
End;

Function TRegObj.CheckKey: Boolean;
Begin
//开发人员根据自己的需要进行修改,在这里是为了简单起见
  Result := FKey= FSerial;
End;

Function TRegObj.Execute: Boolean;
Var
  Msg: String;
  T: Integer;
Begin
  T := GetTimes;
  GetKey;
  SetSerial;
  If FKey<> FSerial Then
  Begin
    Msg := '  您这是第'+ IntToStr( T )+ '次运行此程序(最大次数:'+ IntToStr( FMaxTimes )+ ')!';
    Application.MessageBox( PChar( Msg ), '用户信息', Mb_Ok+ Mb_IconWarning );
    Msg := '欢迎使用'+ Company+ '的软件,如果您觉得满意的话,请注册或购买正版软件!';
    Application.MessageBox( PChar( Msg ), '建议', Mb_Ok+ Mb_IconInformation );
    If T> FMaxTimes Then
    Begin
      If Application.MessageBox( '  是否注册?', '注册', Mb_YesNo+ Mb_IconQuestion )= Id_Yes Then
      Begin
        Msg := '您的注册号是:“'+ FSerial+ '”'+ Chr( 13 )+ Chr( 10 )+
          '请您将以上序列号通过电子邮件寄给以下信箱:'+ FEmail;
        Application.MessageBox( PChar( Msg ), '软件 注册', Mb_Ok+ Mb_Iconinformation );
      End;
      Application.Terminate;
    End;
  End;
End;

End.

控件写好了,看看控件的使用方法:

Procedure TForm1.FormCreate( Sender: TObject );
Var
  AObj: TRegObj;
Begin
  Try
    AObj := TRegObj.Create;
    AObj.MaxTimes := 30;
    AObj.Company := 'Savagers';
    AObj.Email := 'HuangJacky@163.com';
    AObj.Execute;
  Finally
    AObj.Free;
  End;
End;

就这么简单了.
好了,介绍完了,文章最早在大富翁上面看见,自己测试了下正常.
原作者不详了,不过我们还是要感谢他.

转载于:https://my.oschina.net/cookblack/blog/621386

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值