公用機房或辦公室的電腦通常由多人共享,身為管理者或主要使用者,往往希望掌握機器何時被開啟使用。若能建立一份開機記錄,即可隨時透過登錄編輯器查看使用情況。本文將示範如何使用 C++ Builder 5 撰寫一個無視窗的背景程式,於每次開機時自動在登錄表中記錄開機時間與次數,並讓程式自身註冊為開機自動執行,無需手動設定。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 註冊自身,只需執行一次即可完成部署。在 C++ Builder 5 中選擇 File > New Application,將專案另存為 Logon.bpr。接著開啟 Project > View Source,刪除 Logon.cpp 中建立表單的兩行程式碼:
USEFORM("Unit1.cpp", Form1);
Application->CreateForm(__classid(TForm1), &Form1);
完整的 Logon.cpp 程式碼如下,重點在於登錄表操作與自我註冊邏輯:
#include <vcl.h>
#include <registry.hpp> // 添加登錄表支援
#pragma hdrstop
USERES("logon.res");
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
int num = 0;
TRegistry *Registry = new TRegistry;
Registry->RootKey = HKEY_USERS;
// 嘗試開啟記錄鍵值,不存在則建立並進行首次註冊
if (!Registry->OpenKey(".DEFAULT\\Logon\\Records", false))
{
Registry->CreateKey(".DEFAULT\\Logon\\Records");
if (!Registry->OpenKey(".DEFAULT\\Logon\\Records", false))
return 0;
else
{
// ① 將自身加入開機自動執行
TRegistry *Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);
Reg->WriteString("Logon", Application->ExeName);
Reg->CloseKey();
delete Reg;
Application->MessageBox("登錄程式註冊成功!", "結果", MB_OK); // ②
Registry->WriteInteger("開機次數", num);
Registry->WriteString("程式註冊時間", Date() + Time());
return 0;
}
}
else
{
// ③ 讀取現有次數,遞增並記錄本次開機時間
num = Registry->ReadInteger("開機次數");
Registry->WriteInteger("開機次數", num + 1);
Registry->WriteString("第" + AnsiString(num + 1) + "次開機", Date() + Time());
}
Registry->CloseKey();
delete Registry;
Application->Initialize();
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
將上述登錄表讀寫邏輯移植至其他 C++ Builder 應用程式,即可實作試用版限制。例如在 ③ 處加入判斷:
if (num == 30)
{
Application->MessageBox("本程式已經使用 30 次,將要退出!!", "警告", MB_OK);
return 0;
}
並移除 ① 到 ② 的自我註冊程式碼,即可編譯出具備使用次數限制的應用程式。同理也可擴充為時間限制機制。
為產出獨立的 EXE 檔,請在 Project > Options 中取消勾選 Linker 分頁的 Use dynamic RTL 以及 Packages 分頁的 Build with runtime packages。將編譯產生的 Logon.exe 複製至目標電腦固定資料夾(如 Windows 目錄)並執行一次,即完成自動註冊與後續記錄功能。