目前,許多應用程序都有在一定限制條件內免費使用的功能,利用該功能可以 有效限制非法用戶的使用,同時,還可以使合法用戶在充分了解軟件優缺點的基 礎上,再決定是否購買。本文稱實現這種功能的方法為保護方法。保護方法的利 用在保護正版軟件的基礎上,既有效地擴大了軟件的使用范圍,又給用戶提供了 進行充分選擇的機會。
保護方法
本文介紹4種利用C++ Builder 實現的保護方法:
利用注冊表限制程序使用的天數,比如限制使用30天;
利用注冊表限制程序使用的次數,比如限制使用45次;
設定程序 使用的截止日期,比如設截止日期為2001年8月31日;
限制每次使用程序 的時間,比如一次允許使用50分鐘。
這些保護方式既可以單獨使用,也可 以幾個同時使用實現綜合保護。
編程思路
1.方法1和方法2
在程序主窗體的OnCreate事件過程中,定義注冊表TRegistry類對象指針 Reg:
TRegistry *Reg = new TRegistry;
通過其屬性RootKey定位 注冊表根鍵,如:
Reg->RootKey = HKEY_USERS;
//可根據需 要選擇
利用OpenKey方法打開根鍵下的一個自定義主鍵,例如:
Reg->OpenKey(“.DEFAULT\\Myprogram\\Records”, false)
若該主鍵不存在(即首次運行本程序時),需要利用CreateKey() 方法創建該主鍵,並將其打開,寫入子鍵及鍵值如下(參見圖1):
//“Count”鍵值記錄本程序運行次數
Reg- >WriteInteger(“Count”,1);
//“Flag”鍵值 記載本程序使用是否有過期的記錄
Reg->WriteInteger (“Flag”,0);
//“First”鍵值記錄首次運行本程 序的日期
Reg->WriteDate(“First”,Date ());
//“Last”鍵值記錄上一次運行本程序的日期
Reg ->WriteDate(“Last”,Date());
圖 1
通過對 “First”鍵值的讀取獲得首次運行程序時的日期,再與系統當前的日 期進行比較,判斷是否超過指定的天數而決定是否終止程序的運行,從而實現使 用天數的限制。通過對“Count”鍵值的讀取獲得程序使用的次數,判 斷是否超過指定的次數而決定是否終止程序的運行,以實現使用次數的限制。
此外,通過讀取“Flag”鍵值可以了解程序是否有過期記錄, 其值為1表示程序使用已經過期;讀取“Last”鍵值可以取得上一次使 用本程序的日期。
如果經過判斷沒有超過規定的使用期限,則更新 “Count”和“Last”的鍵值:
//使用次數加 1
Reg->WriteInteger(“Count”, Reg- >ReadInteger(“Count”)+1);
//重新寫入當前日期
Reg->WriteDate(“Last”, Date());
2.方法 3
直接在主窗體的OnCreate事件過程中判斷當前日期是否超過預定的截止 日期,決定是否終止程序運行。
3.方法4
利用一個時間組件,在它 的OnTimer事件過程中隨時檢測本次程序運行的時間(從程序啟動到當前)是否超 過預設的時間,從而決定是否終止程序的運行。
具體實現
1. 限制 使用天數(如30天)
在主窗體的OnCreate事件過程中加入代碼判斷程序的 使用是否超過30天,若是,則終止程序運行並記錄“Flag”鍵值為1。 當前系統日期由VCL庫函數Date()獲取。主要代碼如下:
//定義日期型對 象
TDate firstDate, currentDate;
//獲取首次運行程序日期
firstDate=Reg->ReadDate(“First”);
//獲取首 次運行程序日期
currentDate=Date();
if(currentDate.Val-firstDate.Val >30)
{
Application->MessageBox(“本程序使用已經超過30天!\n將要關閉程 序...”,“結果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
//終止程序運行
Application->Terminate();
}
2. 限制使用次數(如45次)
在主窗體的OnCreate事件過 程中加入代碼判斷程序的使用是否超過45次,若是,則終止程序運行並記錄 “Flag”鍵值為1。主要代碼如下:
if(Reg- >ReadInteger(“Count”) > 45)
{
Application->MessageBox(“本程序使用已經超過了45次!\n程序即將 關閉...”,“結果”,MB_OK);
Reg- >WriteInteger(“Flag”,1);
Application->Terminate();
}
3. 設置使用截止日期(如截止日期為2001年8月31日)
該方法不需要修改注冊表,在主窗體的OnCreate事件過程中加入如下代碼即可:
//定義日期型變量(對象)
TDate endDate, currentDate;
//設置日期分隔符
DateSeparator = ‘-';
//設置日期表達格式
ShortDateFormat = “yyyy/mm/dd”;
currentDate=Date();
//日期轉換
endDate=StrToDate(“2001-08-31”);
if(currentDate.Val >endDate.Val)
{
Application->MessageBox(“已經超過期限,本程序已不能使用!\n將 要關閉程序...”,“結果”,MB_OK);
file://Reg->WriteInteger(“Flag”,1);
Application->Terminate();
}
4. 限制每次使用的時間(如限用50分鐘)
該方法不需要 修改注冊表,在一個TTimer組件的OnTimer事件過程中,隨時檢測系統當前時間與 程序的啟動時間之間是否超過50分鐘即可。其中程序的啟動時間可以在主窗體的 OnCreate事件過程中取得,這需要定義日期時間型全局變量startDateTime和 currentDateTime:
TDateTime startDateTime, currentDateTime;
為獲得程序的啟動時間,在主窗體的OnCreate事件過程 中加入如下代碼:
startDateTime = Now();
在時間組件的OnTimer 事件過程中加入以下代碼:
currentDateTime=Now();
if(currentDateTime.Val - startDateTime.Val > 50.0/(60*24))
{
//計時器停止計時,等待消息框關閉
Timer1->Enabled = false;
Application->MessageBox(“本次程序已經運行了50分鐘!\n將要關閉 程序...”,“結果”,MB_OK);
//關閉程序
Close();
}
幾點說明
1.可以將注冊表根鍵定位為其他的鍵(參見圖 1),其主鍵的定義應具有“個性化”,也可以利用已有的主鍵,層次 可以多些,這樣隱蔽性更好,能最大限度地保護應用程序。
2.為了防止 倒撥系統時鐘至上一次使用程序的日期之前,通過讀取“Last”鍵值 可以對此進行檢測和處理,代碼如下:
TDate lastDate, currentDate;
//獲得上一次運行本程序的日期
lastDate = Reg->ReadDate(“Last”);
currentDate = Date();
if(currentDate.Val< lastDate.Val)
{
Application->MessageBox(“系統時鐘的日期已被回撥!\n本程序即將 關閉...”,“結果”,MB_OK);
Reg->WriteInteger(“Flag”,1);
//終止程序的運行
Application->Terminate();
}
3.一旦“Flag”鍵值為1,說明程序已經過期,可用以下代碼限制再 次運行程序:
if(Reg->ReadInteger(“Flag”)==1)
{
Application->MessageBox(“本程序使用已經過期!\n將要關閉程 序...”,“結果”,MB_OK);
Application->Terminate();
}
4.限制程序的使用天數或次數是通過訪問注冊表實現的,對實 施該項保護的程序即使重新安裝也不能消除限制,除非刪除注冊表中相應的鍵值 。