You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于实现内存信息写入文本文件的简易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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:22