後台運行、無用戶交互、可設置開機自啟。C 語言無類封裝,適合理解 SCM(服務控制管理器)底層交互流程。
void main() {
SERVICE_TABLE_ENTRY table[2] = {
{"MemoryStatus", (LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL, NULL}
};
StartServiceCtrlDispatcher(table); // 主線程轉為控制分派器
}
void ServiceMain(int argc, char **argv) {
hStatus = RegisterServiceCtrlHandler("MemoryStatus", ControlHandler);
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
SetServiceStatus(hStatus, &ServiceStatus);
if (InitService()) {
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);
// 啟動工作循環線程或直接循環
}
}
void ControlHandler(DWORD request) {
switch (request) {
case SERVICE_CONTROL_STOP:
ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(hStatus, &ServiceStatus);
// 通知工作線程退出
break;
// ... 其他命令
}
}
int InitService() {
CreateDirectory("C:\\MyServices", NULL);
HANDLE hThread = CreateThread(NULL, 0, WorkerThread, NULL, 0, NULL);
return (hThread != NULL);
}
DWORD WINAPI WorkerThread(LPVOID param) {
while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) {
MEMORYSTATUS ms; ms.dwLength = sizeof(ms);
GlobalMemoryStatus(&ms);
char buf[128];
sprintf(buf, "Available Physical Memory: %lu KB", ms.dwAvailPhys / 1024);
WriteToLog(buf);
Sleep(5000);
}
return 0;
}
memsvc.exesc create MemoryStatus binPath= "C:\path\memsvc.exe"sc start MemoryStatus 或服務管理器中啟動C:\MyServices\memstatus.txt