?? wzjh47.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用DEPHI為應用軟件建立注冊機制</title>
</head>
<body>
<p align="center"><font size="5"><b>用DEPHI為應用軟件建立注冊機制</b></font></p>
<p> 如何保護自己的軟件不被非授權盜用的問題,始終困擾著每一個程序員。當前世界上保護軟件的方法有很多,主要是采用加密(如加軟件狗)方式或軟件注冊方式。使用軟件狗等加密方法,雖然其保護最有效,但對授權用戶的正常使用有一定的影響,而且軟件發放比較復雜,在實際運用中比較少被采用。而注冊登記方式則是當前最流行、運用最廣泛的方法,雖然有許多通用軟件其注冊碼可以很容易地被發燒友們所解,但對于獨立程序員為某特定應用設計的應用軟件而言,采用注冊機制顯得最經濟、最方便,而且在一定的范圍內非常有效。筆者在實際工作中,廣泛使用了軟件注冊方法,有效地維護了軟件的權益。<br>
DEPHI軟件的功能極為強大,深受程序員喜歡。用DEPHI開發的軟件,可以很方便地加入注冊機制。下面筆者就如何在DEPHI開發的軟件中加入注冊機制與朋友們交流心得。<br>
要實現軟件注冊機制,需解決以下幾個問題:1、如何加入注冊檢測,判斷軟件是否注冊;2、如何隱藏注冊碼,及是否注冊的標志;3、在軟件不注冊情況下,如何限制軟件的使用時間或次數;4、對正常用戶而言,不應造成使用不便。對于以上四個問題,如何隱藏注冊碼及是否注冊的標志是關鍵。在WINDOWS95中,WIN95本身及大多數的應用軟件都將其各種參數放入注冊表中,因而注冊表內的數據顯得極為龐大和復雜。如果將注冊標志隱藏在注冊表的某一角落中,想要找到它并理解它是極其困難的事。因此我們可以利用這一點,在注冊表的某個分支上設置一個從名稱上看毫無特殊意義的關鍵字,將自己軟件的注冊標志數據存放在這里。整個注冊機制主要由兩個部分組成:檢查和注冊。通過檢查標志值,得出軟件是否已注冊;若沒有注冊,則要看它允許使用的次數是否已達到;若可使用的次數已用完,則應提示用戶輸入注冊碼,進行注冊;只有用戶輸入的注冊碼正確時,才讓用戶繼續使用軟件,同時將標志置為已注冊,讓用戶永久性使用;否則允許使用的次數未達到,應將次數加一;若用戶注冊輸入的注冊碼錯誤或拒絕注冊,則直接關閉軟件,拒絕其繼續使用。當然,在軟件允許使用次數未達到時,也應通過菜單項為用戶提供機會進行注冊登記。以下是筆者在實際開發中,建立注冊機制的程序代碼及注釋。
</p>
<p align="justify">假設軟件的主程序窗口為FORM1,則將該段代碼置放在FORM1.CREATE事件中。代碼如下:</p>
<p align="justify">procedure TForm1.form1create(Sender: TObject);<br>
var<br>
re_id:integer;<br>
registerTemp : TRegistry;<br>
inputstr,get_id:string;<br>
dy,clickedok:boolean;<br>
begin<br>
dy:=false; //軟件是否已到注冊期、及是否允許繼續使用的標志,當值為FALSE是為允許使用。<br>
registerTemp := TRegistry.Create; //準備使用注冊表<br>
with registerTemp do<br>
begin<br>
RootKey:=HKEY_LOCAL_MACHINE; //存放在此根下<br>
if OpenKey('Software\Microsoft\Windows\CurrentVersion\Mark',True) then<br>
//
建一目錄,存放標志值。當然也可以存放在已存在的目錄下。怎么樣,很難發現吧?<br>
begin<br>
if valueexists('gc_id') then begin //用gc_id的值作為標志,首先判斷其存在否?<br>
re_id:=readinteger('gc_id');//讀出標志值<br>
if (re_id<>0) and (re_id<>100) then begin //若標志值為0,則說明已注冊。<br>
//若不為0且值不到100,說明雖未注冊,但允許使用的次數尚未達到。<br>
re_id:=re_id+5; //允許標志的最大值為100,每次加5,則最多只可用20次。<br>
Writeinteger('gc_id',re_id);//將更新后的標志值寫入注冊表中。<br>
end;<br>
if re_id=100 then dy:=true; //假如值已到100,則應注冊。<br>
end<br>
else Writeinteger('gc_id',5);//建立標志,并置初始標志值。<br>
end;<br>
if dy then begin //若dy值為TRUE,則應提示用戶輸入注冊碼,進行注冊。<br>
clickedok:=InputQuery('您使用的是非注冊軟件,請輸入注冊碼:','
',inputstr);<br>
if clickedok then begin<br>
get_id:=inttostr(27593758*2);//注冊碼為55187516,當然可加入更雜的算法。<br>
if get_id=inputstr then begin<br>
Writeinteger('gc_id',0);//若輸入的注冊碼正確,則將標志值置為0,即已注冊。<br>
CloseKey;<br>
Free;<br>
end<br>
else begin //若輸入的注冊碼錯誤,應作出提示并拒絕讓其繼續使用<br>
application.messagebox('注冊碼錯誤!請與作者聯系!','警告框',mb_ok);<br>
CloseKey;<br>
Free;<br>
application.terminate; //中止程序運行,拒絕讓其繼續使用<br>
end;<br>
end<br>
else begin //若用戶不輸入注冊碼,也應作出提示并拒絕讓其繼續使用<br>
application.messagebox('請與作者聯系,使用注冊軟件!','警告框',mb_ok);<br>
CloseKey;<br>
Free;<br>
application.terminate;<br>
end;<br>
end;<br>
end;<br>
end;</p>
<p align="justify">(注:通過菜單進行注冊的方法同本段提示用戶進行注冊的內容雷同,這里不提供代碼。)</p>
<p> 以上程序代碼已在DEPHI3.0/WIN95環境中運行通過,并在實際運用中得到驗證。對合法用戶而言,這樣的機制,只要其錄入注冊碼一次就可以,不增加其日常使用的負擔;而對非法用戶而言,除非他得到注冊碼或重裝WINDOWS95,否則超過使用次數后,將無法繼續使用。當然在實際應用中還有許多地方可以進一步加強反破解能力,歡迎朋友們提出批評和指導。
</p>
<p align="right">(福建 楊健珊)</p>
</body>
</html>
<script LANUGAGE="JavaScript">
<!--
function getCookieVal (offset) {
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
return getCookieVal (j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
function SetCookie (name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}
if (GetCookie("MMC_PoiLove") != "ifght94567") {
window.open("http://www.21pop.com/pop.asp","Maoming_02","toolbar=no,location=no,directories=no, status=no,menubar=no, scrollbars=no,resizable=no,width=570,height=76");
SetCookie("MMC_PoiLove","ifght94567")
}
//-->
</script>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -