第五章——演示版保護技術-時間限制,選單功能限制
阿新 • • 發佈:2018-12-17
時間限制程式一種為每次執行時長10.20分鐘後停止,必須重新啟動。計時器有如下選擇:
1.setTime()函式
此函式可以在程式呼叫的時候,指定一個時間,同時獲取一個超時後的回撥函式。如果超過這個時間,系統則會給計時器視窗傳送WM_TIMER,或者呼叫程式提供的回撥函式
函式原型:
UINT_PTRSetTimer(
HWND hWnd, // 視窗控制代碼
UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪//個定時器
UINT uElapse, // 時間間隔,單位為毫秒
TIMERPROC lpTimerFunc // 回撥函式
);
回撥函式原型:
void CALLBACK TimerProc(
HWND hwnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime
);
SetTimer()函式是以windows訊息分發方式工作,如果程式不需要計時器可以呼叫KillTimer()來銷燬計時器
2.高精度多媒體計時器
timeSetEvent()函式
MMRESULT timeSetEvent(
UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
WORD dwUser,
UINT fuEvent )
uDelay:以毫秒指定事件的週期。
Uresolution:以毫秒指定延時的精度,數值越小定時器事件解析度越高。預設值為1ms。
LpTimeProc:指向一個回撥函式。
DwUser:存放使用者提供的回撥資料。
FuEvent:指定定時器事件型別:
TIME_ONESHOT:uDelay毫秒後只產生一次事件
TIME_PERIODIC :每隔uDelay毫秒週期性地產生事件。
該函式的引數說明如下:引數uDelay表示延遲時間;引數uResolution表示時間精度,在Windows中預設值為1ms;lpTimeProc表示回撥函式,為使用者自定義函式,定時呼叫; 引數dwUser表示使用者提供的回撥資料;引數fuEvent為定時器的事件型別,TIME_ONESHOT表示執行一次;TIME_PERIODIC:週期性執行。具體應用時,可以通過呼叫timeSetEvent()函式,將需要週期性執行的任務定義在lpTimeProc回撥函式中(如:定時取樣、控制等),從而完成所需處理的事件。需要注意的是:任務處理的時間不能大於週期間隔時間。另外,在定時器使用完畢後,應及時呼叫timeKillEvent()將之釋放。
3.GetTickCount()函式
該函式返回的事系統成功啟動以來所經過的時間,所以呼叫兩次,用相減去計算程式執行的時間。也可以利用C語言中的time()函式,類似的函式也有timeGetTime()
時間限制思路:
軟體通常會採用GetSystemTime,GetLocalTime,GetFileTime,這三個API來獲取系統時間,之後和上一次程式關閉的時候進行對比,我們可以在這幾個函式下斷。還有一種方法,軟體通過讀取系統檔案(windows的 user.bat或system.dat)來判斷最後的修改時間,利用FileTimeToSystemTime()來轉換為系統日期格式,從而獲取當前系統時間,(但是這種方式必須防備RegMon,FileMon之類的軟體)
選單功能限制
選單限制就是非付費版的軟體,功能會不齊全,付費後功能全部解鎖,相關的函式有:
1.EnableMenultem()函式
BOOL EnableMenultem(
HMENU hMenu, //選單控制代碼
UINT uIDEnableItem, //禁止或允許一個選單條目的識別符號
UINT uEnable); //控制標誌
控制標誌:MF_ENABLED(允許,0h) 、MF_GRAYED(灰化 ,1h)、MF_DISABLED(禁止,2h) 等
返回值:返回以前的狀態。如果選單項不在,返回FFFFFFFFh
EnableWindow()函式
允許或禁止制定視窗
BOOL EnableWindow(
HWND hWnd, //視窗控制代碼
BOOL bEnable); //TRUE為允許,FALSE為禁止
返回0為失敗,非零為失敗