程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi程序的時限和加密方法

Delphi程序的時限和加密方法

編輯:Delphi

  本例中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;

  三、密碼的變換函數。此變換函數可由讀者自由發揮,在此,僅示一例而已。


  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;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved