文/宋爽
本例中TRegistry是关键类,Delphi 4.0不能自行加入,需在uses部分手工加入“registry”,通过其方法“ReadString”和“WriteString”来读出和写入字符,亦可通过其方法“ReadDate”和“WriteDate”来读出和写入日期。
程序第一次运行就写入其运行时间,应用期限为30天,超过30天就不再运行。全局变量NoRegistry、SpareDays来分别判断是否
注册和剩余期限,自定义函数Encrypt为用户名到
密码的变换函数。
一、程序启动时,通过
搜索注册表,判断是否第一次运行和是否注册,来确定
程序是否运行。
procedure TForm1.FormCreate(Sender: TObject);
var
Reg:Tregistry;
KeyName,TempCode,TempName,TempStr:string;
Same:Integer;
FirstDate,NowDate:Tdatetime;
NumberOfDays:real;
begin
NoRegistry:=true;
NowDate:=date; //取得运行时系统日期
try
//创建注册表,有该键则读取,无则创建
Reg:=Tregistry.Create ;
Reg.RootKey :=hkey_local_machine;
KeyName:=''Softwarejsjbxample'';
if Reg.OpenKey(KeyName,true) then
begin
TempName:=Reg.ReadString(''UsrName'');
TempCode:=Reg.ReadString(''Passwd'');
//读取用户名,注册号
try
FirstDate:=Reg.ReadDate(''Date'');
//非第一次则读入第一次运行时间
except
Reg.WriteDate(''Date'',NowDate);
// 若为第一次运行,则写入系统日期
FirstDate:=NowDate;
end;
end ;
reg.CloseKey ;
finally
reg.Free ;
end;
TempStr:=Encrypt(TempName);
//通过自定义函数Encrypt()来获取密码
Same:=CompareText(TempStr,TempCode);
//比较密码
if TempName<>'''' then
if Same=0 then
NoRegistry:=false;
//验证密码,通过NoRegistry为false
if NoRegistry then
begin //若未注册
NumberOfDays:=Nowdate-FirstDate;
SpareDays:=round(31-NumberOfDays);
Label1.Caption :=FloatToStr(SpareDays);
if((NumberOfDays>31) or (NumberOfDays<-1)) then
begin
showmessage(''
程序未注册超过试用期或更改系统时间,将终止运行!'');
application.Terminate;//超过30天,则禁止运行
end;
end;
end;
二、注册过程,其响应入口可放于"About"内。
procedure TAbout.Button1Click(Sender: TObject);
var
InptName,InptCode,RealCode:String;
Same:Integer;
Reg:Tregistry;
Keyname:String;
begin
if NoRegistry then //未注册时做
begin
RealCode:='''';
InptName:= InputBox(''注册'', ''输入你的名字'', '''');
if InptName<>'''' then
begin
InptCode:= InputBox(''注册'', ''输入注册号'', '''');
RealCode:=Encrypt(InptName);
Same:=CompareText(RealCode,InptCode);
if (Same<>0) then
showmessage(''注册号码不对,注册未成功!'')
else
begin
//密码匹配时做:把用户名、密码写入注册表
Try
Reg:=Tregistry.Create ;
Reg.RootKey :=hkey_local_machine;
KeyName:=''Softwarejsjbxample'';
if Reg.OpenKey(KeyName,true) then
begin
Reg.WriteString(''Passwd'',InptCode);
Reg.WriteString(''UsrName'',InptName);
end;
reg.CloseKey ;
finally
Reg.Free ;
end;
NoRegistry:=false;
//可修改注册后的界面
end;
end;
end;
end;
三