Delphi程序的時(shí)限與加密方法
發(fā)表時(shí)間:2023-08-01 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]文/宋爽 本例中TRegistry是關(guān)鍵類,Delphi 4.0不能自行加入,需在uses部分手工加入“registry”,通過其方法“ReadString”和“WriteString”來讀出和寫...
文/宋爽
本例中TRegistry是關(guān)鍵類,Delphi 4.0不能自行加入,需在uses部分手工加入“registry”,通過其方法“ReadString”和“WriteString”來讀出和寫入字符,亦可通過其方法“ReadDate”和“WriteDate”來讀出和寫入日期。
程序第一次運(yùn)行就寫入其運(yùn)行時(shí)間,應(yīng)用期限為30天,超過30天就不再運(yùn)行。全局變量NoRegistry、SpareDays來分別判斷是否注冊(cè)和剩余期限,自定義函數(shù)Encrypt為用戶名到
密碼的變換函數(shù)。
一、程序啟動(dòng)時(shí),通過搜索注冊(cè)表,判斷是否第一次運(yùn)行和是否注冊(cè),來確定程序是否運(yùn)行。
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; //取得運(yùn)行時(shí)系統(tǒng)日期
try
//創(chuàng)建注冊(cè)表,有該鍵則讀取,無則創(chuàng)建
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');
//讀取用戶名,注冊(cè)號(hào)
try
FirstDate:=Reg.ReadDate('Date');
//非第一次則讀入第一次運(yùn)行時(shí)間
except
Reg.WriteDate('Date',NowDate);
// 若為第一次運(yùn)行,則寫入系統(tǒng)日期
FirstDate:=NowDate;
end;
end ;
reg.CloseKey ;
finally
reg.Free ;
end;
TempStr:=Encrypt(TempName);
//通過自定義函數(shù)Encrypt()來獲取密碼
Same:=CompareText(TempStr,TempCode);
//比較密碼
if TempName<>'' then
if Same=0 then
NoRegistry:=false;
//驗(yàn)證密碼,通過NoRegistry為false
if NoRegistry then
begin //若未注冊(cè)...
NumberOfDays:=Nowdate-FirstDate;
SpareDays:=round(31-NumberOfDays);
Label1.Caption :=FloatToStr(SpareDays);
if((NumberOfDays>31) or (NumberOfDays<-1)) then
begin
showmessage('程序未注冊(cè)超過試用期或更改系統(tǒng)時(shí)間,將終止運(yùn)行!');
application.Terminate;//超過30天,則禁止運(yùn)行
end;
end;
end;
二、注冊(cè)過程,其響應(yīng)入口可放于"About"內(nèi)。
procedure TAbout.Button1Click(Sender: TObject);
var
InptName,InptCode,RealCode:String;
Same:Integer;
Reg:Tregistry;
Keyname:String;
begin
if NoRegistry then //未注冊(cè)時(shí)做
begin
RealCode:='';
InptName:= InputBox('注冊(cè)', '輸入你的名字', '');
if InptName<>'' then
begin
InptCode:= InputBox('注冊(cè)', '輸入注冊(cè)號(hào)', '');
RealCode:=Encrypt(InptName);
Same:=CompareText(RealCode,InptCode);
if (Same<>0) then
showmessage('注冊(cè)號(hào)碼不對(duì),注冊(cè)未成功!')
else
begin
//密碼匹配時(shí)做:把用戶名、密碼寫入注冊(cè)表
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;
//可修改注冊(cè)后的界面
end;
end;
end;
end;
三、密碼的變換函數(shù)。此變換函數(shù)可由讀者自由發(fā)揮,在此,僅示一例而已。
Function TForm1.Encrypt(TempStr:string):string;
Var
Str1:String;
i,j:Integer;
Begin
Str1:='';
For i:=1 to Length(TempStr) do
begin
j:=(i?i?i?i mod (i+30))+(i?i mod (i+20))+i?3+1;
Str1:=Str1+chr(ord(TempStr[i])+j);
j:=(i?i?i?i mod (i+30))+(i?i mod (i+20))+i?3+1;
Str1:=Str1+chr(ord(TempStr[i])+j);
End;
Result:=Str1;
end;
此程序在Windows98,Delphi 4.0下調(diào)試通過。