許多商業軟體都會提供試用版,常見的限制方式包括使用天數、功能鎖定或執行次數限制。本文將示範如何在 MFC 專案中,透過 Windows 註冊表記錄並遞減剩餘次數,打造一個簡單且有效的試用版保護機制。
最佳的切入點是 CWinApp::InitInstance()。在主視窗建立之前,先檢查註冊表機碼 HKEY_LOCAL_MACHINE\Software\dm 下的 Num 值:
return FALSE 終止啟動。BOOL CMyApp::InitInstance()
{
// ... 既有初始化碼 ...
HKEY hKey;
unsigned char buffer[255] = {0};
unsigned long length = 255, type;
int count = 0;
// 讀取現有計數
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\dm"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
RegQueryValueEx(hKey, _T("Num"), NULL, &type, buffer, &length);
RegCloseKey(hKey);
count = atoi((const char*)buffer);
}
if (count == 0) { // 首次執行
RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\dm"), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
RegSetValueEx(hKey, _T("Num"), 0, REG_SZ, (const BYTE*)"5", 2);
RegCloseKey(hKey);
AfxMessageBox(_T("最後用 5 次!"));
}
else if (count == 1) { // 最後一次用完
AfxMessageBox(_T("請註冊!"));
return FALSE;
}
else { // 正常遞減
count--;
char buf[16];
_itoa_s(count, buf, 10);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\dm"), 0, KEY_WRITE, &hKey);
RegSetValueEx(hKey, _T("Num"), 0, REG_SZ, (const BYTE*)buf, (DWORD)strlen(buf)+1);
RegCloseKey(hKey);
CString msg; msg.Format(_T("最後用 %d 次!"), count);
AfxMessageBox(msg);
}
// ... 後續建立主視窗等 ...
return TRUE;
}
HKLM 需管理員權限,建議改用 HKCU 或安裝時由安裝程式預寫。「讀寫計數器」的核心思路可輕易移植至:
掌握這套「初始化攔截 → 讀取狀態 → 決策 → 更新狀態」的模式,即可靈活應用於各種試用版授權場景。祝各位開發順利!