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