線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1409
推到 Plurk!
推到 Facebook!

用Delphi 編寫"共享軟體"

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-10 11:56:40 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 位置庵已經不記得了 知道的請再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
系統時間:2024-05-20 8:09:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!