首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 實作軟體試用次數限制:註冊表計數器完整教學

     編輯:關於VC++

許多商業軟體都會提供試用版,常見的限制方式包括使用天數、功能鎖定或執行次數限制。本文將示範如何在 MFC 專案中,透過 Windows 註冊表記錄並遞減剩餘次數,打造一個簡單且有效的試用版保護機制。

核心邏輯:InitInstance 中攔截啟動流程

最佳的切入點是 CWinApp::InitInstance()。在主視窗建立之前,先檢查註冊表機碼 HKEY_LOCAL_MACHINE\Software\dm 下的 Num 值:

  • 首次執行(值不存在或為 0):寫入預設次數(範例為 5),彈窗提示「最後用 5 次!」
  • 剩餘 1 次:彈窗提示「請註冊!」並直接 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;
}

安全性與擴充建議

  1. 權限考量:寫入 HKLM 需管理員權限,建議改用 HKCU 或安裝時由安裝程式預寫。
  2. 防篡改:可將計數值加密(如 XOR、AES)或散列後再存,避免使用者直接修改註冊表。
  3. 多重驗證:結合檔案系統隱藏檔、WMI 查詢 BIOS 序號、網路授權伺服器等多層防護。
  4. 體驗優化:將「剩餘次數」顯示於啟動畫面或選單列,而非僅用 MessageBox。

同樣邏輯的其他實作方向

「讀寫計數器」的核心思路可輕易移植至:

  • INI / JSON / SQLite 等本地檔案
  • 加密狗(HASP、Sentinel 等)的內部計數器
  • 雲端授權伺服器的 API 呼叫

掌握這套「初始化攔截 → 讀取狀態 → 決策 → 更新狀態」的模式,即可靈活應用於各種試用版授權場景。祝各位開發順利!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved