用Delphi 編寫"共享軟體" |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 位置庵已經不記得了 知道的請再po上或告知一下
用Delphi 編寫"共享軟體"
湖北省枝江市委辦公室(443200)
曹祖權
----本文是筆者用Delphi3 編寫的幾個" 共用" 的小程式,給程式加入註冊功能,讓它變成一
個" 共用軟體",然後把它放入你的主頁,可免費下載,從而幫助您獲得更大的用戶群。
----這裏需說明的是,本文僅從限制軟體功能的側面,探討" 共用軟體" 的編寫方法。
生成軟體登錄碼
----生成一個穩定的且相對唯一的軟體登錄碼,是" 共用軟體" 賴以生存的基礎,所以必須
選擇一個好的演算法來生成軟體登錄碼。
----穩定的涵義是指生成的軟體登錄碼僅與機器的某些固定配置有關,不會因用戶的一些日
常操作而改變。??述方便,本文僅採用了C 盤總容量、Windows 安裝時所輸入的用戶名、
用戶使用本軟體時所提供的單位全稱和用戶姓名等資訊,根據用戶的需要,還可加入硬碟
物理參數、主板的標識等等。
----以下生成軟體登錄碼的代碼,應放置於軟體登錄視窗的" 生成登錄碼" 按鈕的OnClick 事
件代碼中。
procedure TRegBox.BitBtn1Click(Sender: TObject);
var users:pchar;
i:integer;
n1:longint;
//n2:longint,s0,s1,s2,s3:string 定義?全程變數
begin
i:=255;
getmem(users,255); // 分配記憶體空間
getusername(users,i);// 獲得Windows 用戶名
s1:=trim(Edit1.Text);// 用戶輸入的單位全稱
s2:=trim(Edit2.Text);// 用戶輸入的用戶姓名
s0:='jdk' +users +'ue28'; // 避免用戶名太短
freemem(users); // 釋放記憶體空間
s1:=s2 +'xwplskf' +s1 +'ruieo';
// 合成單位全稱和用戶姓名
n1 := DiskSize(3) div 1024 ; //C 盤總容量
n2 :=1 ;
for i:=1 to length(s1) do // 登錄碼與s1 相關聯
n2:=abs((ord(s1[i]) *n2 +$f77)) mod 1000000;
for i:=2 to length(s0) do
// 登錄碼與s0 和C 盤容量相關聯
n2:=abs((ord(s0[i]) *n2 +n1)) mod 1000000;
// 下面的轉換生成8 位元數位的登錄碼n2
n2:=10504007 +abs((n2 +n1) *(length(s1) +length(s0)));
Edit4.text:=copy(inttostr(n2),1,8);
n2:=strtoint(copy(inttostr(n2),1,8));
end;
生成註冊密碼
----有了登錄碼,還需要一個單獨的程式,採取一定的演算法來加密登錄碼,生成一個註冊
密碼,加密演算法的強度越大越好。這個單獨的程式即?電子註冊密碼生成程式,當然它不
能提供給任何用戶,但需要在提供給用戶使用的" 共用軟體" 中" 註冊" 按鈕的OnClick 事件
中,寫入等價的代碼,以判斷用戶自己輸入的註冊密碼是否正確。
procedure Tencodeform.Button1Click(Sender:TObject);
var n2:longint;
s1,s2,s4:string;
i:integer;
begin
n2:=strtoint(Edit1.text);
// 用戶反饋的軟體登錄碼
n2:=120873762 +abs((n2 div 133) *171 xor 39639421);
s1:=copy(inttostr(n2),1,8);
s2:='73461852';
s4:=''; //s4 :由n2 變換生成的註冊密碼
for i:=1 to 8 do
s4:=s4 +s1ord(s2[i]) -ord('1') +1?;
// 在Edit2 編輯框顯示生成的註冊密碼,
將它告訴申請的用戶
Edit2.text:=s4;
end;
註冊
----用戶通過單擊" 註冊" 按鈕,來實現軟體的註冊,這一段代碼要完成以下功能:
程式自動生成的註冊密碼;
用生成的註冊密碼與用戶輸入的註冊密碼進行核對;
如果一致,則關閉" 註冊" 功能表項,並在缺省目錄下創建一個註冊文件,這個文件包括以
下內容:
[USER]
單位全稱、用戶姓名、電話號碼、[CODE?
註冊碼=XXXXXXXX
" 註冊" 按鈕的OnClick 事件代碼如下:
procedure TRegBox.BitBtn2Click(Sender: TObject);
var myfile:textfile;
i:integer;
begin
s5:=trim(Edit5.text);//s5= 用戶輸入註冊密碼
// 以下代碼對n2 進行變換生成註冊密碼
n2:=120873762 +abs((n2 div 133) *171 xor 39639421);
s1:=copy(inttostr(n2),1,8); //8 位元數位
s2:='73461852'; // 移位變換
s4:='';//s4= 程式自動生成的註冊密碼
for i:=1 to 8 do
s4:=s4 +s1ord(s2[i]) -ord('1') +1?;
if strtoint(s4) *7<>strtoint(s5) *7 then begin
MainBox.r2.Visible:=True; // 打開" 註冊" 功能表
Edit4.Text:=''; // 清空登錄碼
Edit5.Text:=''; // 清空註冊密碼
MessageDlg(' 註冊碼不對,請核對後再註冊!
', mtWarning, [mbOk], 0)
end
else begin // 註冊成功後,創建一個註冊文件
MainBox.r2.Visible:=False;
assignfile(myfile,'wps2word.log');
rewrite(myfile);
writeln(myfile,'[ER]');
writeln(myfile,' 單位全稱=',trim(Edit1.Text));
writeln(myfile,' 用戶姓名=',trim(Edit2.Text));
writeln(myfile,' 電話號碼=',trim(Edit3.Text));
writeln(myfile,'CODE]');
writeln(myfile,' 註冊碼=',s4);
closefile(myfile);
MessageDlg
(' 註冊碼成功,謝謝您使用本軟體!
', mtWarning, [mbOk], 0)
end;
end;
判斷軟體是否註冊
----判斷軟體是否註冊的代碼應放在應用程式主視窗的OnCreate 事件中,在這一段代碼中,
主要完成以下功能:
判斷軟體註冊文件是否存在及是否符合規範(可能被用戶誤修改);
從註冊文件中讀取註冊密碼及程式自動生成註冊密碼所需要的資訊;
如果兩者一致,則置註冊成功標誌,關閉主功能表中的" 註冊" 功能表項,否則,打開" 註
冊" 功能表項。
procedure TMainBox.FormCreate(Sender: TObject);
var s0,s1,s2,s3:string;
//s4,s5:string ?全程變數
n1,n2:longint;
myfile:textfile;
users:pchar;
i:integer;
begin
if not fileexists('wps2word.log') then
begin // 不存在註冊文件,則沒有註冊
r2.Visible:=True; // 允許" 註冊" 功能表項
Randomize; // 初始化亂數序列
n1:=random(100000000);
// ?生一個8 位元以內的整數
s4:=inttostr(n1);
// 假設輸入的註冊密碼?s4
s5:=inttostr(n1 +7)
// 假設程式生成的註冊密碼?s5, 令s4< >s5
end
else begin // 存在註冊文件的處理
assignfile(myfile,'wps2word.log');
reset(myfile);
// 讀取用戶註冊資訊及註冊密碼
if not eof(myfile) then readln(myfile,s0);
if not eof(myfile) then readln(myfile,s1);
if not eof(myfile) then readln(myfile,s2);
if not eof(myfile) then readln(myfile,s3);
if not eof(myfile) then readln(myfile,s4);
if not eof(myfile) then readln(myfile,s5);
closefile(myfile);
if (length(s1)< 10) or (length(s2)< 10)
or (length(s3)< 10) or (length(s5)< 15) then
begin
// 文件格式有誤,則刪除註冊文件,並退出
deletefile('wps2word.log');
r2.Visible:=True; // 允許" 註冊" 功能表
Exit; // 退出
end;
i:=255;
getmem(users,255);
getusername(users,i); // 獲得Windows 用戶名
s0:='jdk' +users +'ue28'; // 避免用戶名太短
freemem(users);
s1:=trim(copy(s1,10,length(s1) -9)); // 單位全稱
s2:=trim(copy(s2,10,length(s2) -9)); // 用戶姓名
s5:=trim(copy(s5,8,length(s5) -7));
// 註冊密碼( 待核對)
s1:=s2 +' xwplskf' +s1 +'ruieo';
// 合成單位全稱和用戶姓名
n1 := DiskSize(3) div 1024 ; //C 盤容量
n2 :=1 ;
for i:=1 to length(s1) do
n2:=abs((ord(s1[i]) *n2 +$f77)) mod 1000000;
for i:=2 to length(s0) do
n2:=abs((ord(s0[i]) *n2 +n1)) mod 1000000;
n2:=10504007 +abs((n2 +n1) *(length(s1) +length(s0)));
n2:=strtoint(copy(inttostr(n2),1,8)); // 登錄碼
// 以下部分生成註冊密碼
n2:=120873762 +abs((n2 div 133) *171 xor 39639421);
s1:=copy(inttostr(n2),1,8);
s2:='73461852'; // 移位變換
s4:=''; //S4 ?程式自動生成的註冊密碼
for i:=1 to 8 do
s4:=s4 +s1[ord(s2[i]) -ord('1') +1?;
// 核對註冊文件和自動生成的註冊密碼是否致
if strtoint(s4) *7=strtoint(s5) *7 then
r2.Visible:=False // 一致
else begin // 不一致
deletefile('wps2word.log'); // 刪除註冊文件
r2.Visible:=True; // 允許" 註冊" 功能表項
end;
end;
end;
開放和限制部分功能方法
----採取核對程式自動生成和用戶輸入的註冊密碼是否一致,並檢查" 註冊" 功能表項是否
允許的方式,在應用程式的功能代碼中判斷是否已經註冊,以控制程式的流向。
----if ((r2.Visible=True) or (strtoint(s4) *7<>strtoint(s5) *7)) and ( 其他條件) then
..未註冊時的處理
els e
..成功註冊時的處理。
----至此,本文僅討論了限制軟體使用功能的" 共用軟體" 的編寫方法,如果想限制軟體使
用時間,在軟體註冊標誌中還應包括第一次安裝的時間,並且註冊標誌不能簡單地寫入一
個文件,它應隱藏在硬碟或註冊表的某一特定位置,有興趣的讀者不妨一試。 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |