C++輔導(dǎo):用C++Builder設(shè)定程序使用時間

字號:

目前,許多應(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)的鍵值。