关于实现内存信息写入文本文件的简易Windows服务技术问询
嘿,我帮你把这段监控内存的Windows服务代码整理成清晰的Markdown格式,还补全了代码里缺失的部分,让它能正常运行:
简易Windows内存状态监控服务
这段服务会每隔5秒将系统内存状态写入指定的日志文件中:
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <string> #include <psapi.h> #pragma comment(lib, "psapi.lib") using namespace std; #define SLEEP_TIME 5000 #define LOGFILE "C:\\MyServices\\memstatus.txt" // 注意Windows路径需用双反斜杠转义 SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE hStatus; void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); int InitService(); int WriteToLog(string file_name, string input); // 写入日志文件的辅助函数 int WriteToLog(string file_name, string input) { FILE *f; // 以追加模式打开文件 errno_t err = fopen_s(&f, file_name.c_str(), "a+"); if (err != 0 || f == NULL) { return -1; } fprintf(f, "%s\n", input.c_str()); fclose(f); return 0; } // 获取内存状态并格式化输出 string GetMemoryStatusString() { MEMORYSTATUSEX statex; statex.dwLength = sizeof(statex); GlobalMemoryStatusEx(&statex); char buffer[256]; sprintf_s(buffer, "可用物理内存: %llu MB, 总物理内存: %llu MB, 内存使用率: %u%%", (statex.ullAvailPhys / (1024 * 1024)), (statex.ullTotalPhys / (1024 * 1024)), statex.dwMemoryLoad); return string(buffer); } // 服务入口函数 void ServiceMain(int argc, char** argv) { ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler("MemoryMonitorService", (LPHANDLER_FUNCTION)ControlHandler); if (hStatus == NULL) { WriteToLog(LOGFILE, "注册服务控制句柄失败"); return; } // 初始化服务 int ret = InitService(); if (ret != 0) { ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = ret; SetServiceStatus(hStatus, &ServiceStatus); return; } // 设置服务为运行状态 ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hStatus, &ServiceStatus); // 服务主循环 while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) { string memInfo = GetMemoryStatusString(); WriteToLog(LOGFILE, memInfo); Sleep(SLEEP_TIME); } } // 服务控制处理函数 void ControlHandler(DWORD request) { switch (request) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus, &ServiceStatus); return; default: break; } SetServiceStatus(hStatus, &ServiceStatus); } // 初始化服务(创建日志目录等) int InitService() { // 创建日志目录(如果不存在) CreateDirectory("C:\\MyServices", NULL); WriteToLog(LOGFILE, "内存监控服务已启动"); return 0; } // 服务入口点 int _tmain(int argc, TCHAR* argv[]) { SERVICE_TABLE_ENTRY ServiceTable[] = { { (LPWSTR)L"MemoryMonitorService", (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; if (!StartServiceCtrlDispatcher(ServiceTable)) { WriteToLog(LOGFILE, "启动服务调度器失败"); return GetLastError(); } return 0; }
关键说明
- SLEEP_TIME:设置服务每隔5秒采集一次内存信息
- LOGFILE:指定日志文件的存储路径,Windows路径必须使用双反斜杠转义
- WriteToLog:负责将文本内容追加写入日志文件的工具函数
- GetMemoryStatusString:调用
GlobalMemoryStatusEx获取系统内存状态并格式化为可读字符串 - ServiceMain:服务的核心入口,负责注册服务状态、初始化并进入运行循环
- ControlHandler:处理外部控制请求(如停止服务、系统关机)
内容的提问来源于stack exchange,提问作者ubi butt
相关产品推荐
相关产品推荐

