创建windows服务程序

本文详细介绍了一个Windows服务的C++编程实例,包括服务的启动、停止、日志记录及后台任务执行。通过具体代码展示了如何注册服务控制处理器,处理服务状态,并实现服务的生命周期管理。
// WinService2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

SERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus; 

void WriteLog(char *str){
    FILE *log;
    log =fopen("G://log.txt", "a+");
    if (log ==NULL)
        printf("logfile init failed!");
    fprintf(log,"%s\n", str);
    fclose(log);
}

void InitService(){
    WriteLog("Monitoring started.");
}

/*用来识别服务命令的函数*/
void WINAPI ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_STOP: WriteLog("Monitoring stopped."); ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus); return; case SERVICE_CONTROL_SHUTDOWN: WriteLog("Monitoring stopped."); ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus); return; default: break; } SetServiceStatus (hStatus, &ServiceStatus); return; }
/*用来后台执行任务的主函数*/
void WINAPI ServiceMain(int argc, char** argv){ int error; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler( L"logservice", ControlHandler); if (hStatus == (SERVICE_STATUS_HANDLE)0){ return; } InitService(); ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus (hStatus, &ServiceStatus); while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) { WriteLog("windows service"); Sleep(1000); } return; } void start(){ SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = L"logservice"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); } int _tmain(int argc, _TCHAR* argv[]) { start(); return 0; }

编译成功后,直接使用命令sc create logservice binpath= [你编译成功后exe的文件]

注意binpath=后面与路径的空格

转载于:https://www.cnblogs.com/MyselfDancing/p/3603352.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值