windows service程序的入门范例(三)——真正好用的实战例子

来源:互联网 发布:centos 7.4 官方下载 编辑:程序博客网 时间:2024/06/03 15:02

一、更新

(1)增加了-debug模式

(2)需要将项目设置为:使用多字节字符集

(3)在VS2013测试通过


二、实战

(1)新建 Win32 控制台 项目

(2)使用以下代码

(3)关于如何添加到windows服务的方法,请以管理员启动CMD,然后使用sc 命令进行 添加服务,启动服务,停止服务,删除服务。


头文件:

#include <Windows.h>#include <stdio.h>#include <iostream>using namespace std;#define SLEEP_TIME 5000 //间隔时间#define SERVICE_NAME "testservice"#define FILE_PATH "C:\\log.txt" //信息输出文件SERVICE_STATUS servicestatus;SERVICE_STATUS_HANDLE hstatus;bool brun = false;bool g_bDebug = false;  //判断是否为debug状态 HANDLE g_hSvcStopEvent = NULL;//服务停止句柄  void WINAPI ServiceMain(int argc, char** argv);void WINAPI CtrlHandler(DWORD request);int WriteToLog(char* str);//输出信息到本地文件void DoMyWork();//这个函数,是真正的工作内容//


源文件:

#include "stdafx.h"#include "test2.h"void DoMyWork(){brun = true;MEMORYSTATUS memstatus;char str[100];memset(str, '\0', 100);while (brun){GlobalMemoryStatus(&memstatus);int availmb = memstatus.dwAvailPhys / 1024 / 1024;sprintf_s(str, 100, "NEW available memory is %dMB", availmb);WriteToLog(str);Sleep(SLEEP_TIME);}}int WriteToLog(char* str){FILE* pfile;fopen_s(&pfile, FILE_PATH, "a+");if (pfile == NULL){return -1;}fprintf_s(pfile, "%s\n", str);fclose(pfile);return 0;}void WINAPI ServiceMain(int argc, char** argv){servicestatus.dwServiceType = SERVICE_WIN32;servicestatus.dwCurrentState = SERVICE_START_PENDING;servicestatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;//在本例中只接受系统关机和停止服务两种控制命令servicestatus.dwWin32ExitCode = 0;servicestatus.dwServiceSpecificExitCode = 0;servicestatus.dwCheckPoint = 0;servicestatus.dwWaitHint = 0;//服务名称  //接收控制码,并做操作hstatus = ::RegisterServiceCtrlHandler(SERVICE_NAME, CtrlHandler);if (hstatus == 0){WriteToLog("RegisterServiceCtrlHandler failed");return;}WriteToLog("RegisterServiceCtrlHandler success");//向SCM 报告运行状态servicestatus.dwCurrentState = SERVICE_RUNNING;SetServiceStatus(hstatus, &servicestatus);//下面就开始任务循环了,你可以添加你自己希望服务做的工作在DoMyWork()函数里面DoMyWork();WriteToLog("service stopped");}void WINAPI CtrlHandler(DWORD request){//接收控制器代码,并执行操作switch (request){case SERVICE_CONTROL_STOP:brun = false;servicestatus.dwCurrentState = SERVICE_STOPPED;break;case SERVICE_CONTROL_SHUTDOWN:brun = false;servicestatus.dwCurrentState = SERVICE_STOPPED;break;default:break;}SetServiceStatus(hstatus, &servicestatus);}//调试入口int DebugProcess(){DoMyWork();return 0;}//服务入口int ServiceProcess(int argc, char* argv[]){SERVICE_TABLE_ENTRY entrytable[2];entrytable[0].lpServiceName = SERVICE_NAME;//服务名称entrytable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;entrytable[1].lpServiceName = NULL;entrytable[1].lpServiceProc = NULL;StartServiceCtrlDispatcher(entrytable);return 0;}int _tmain(int argc, char* argv[]){int nRetCode = 0;if (argc>1 && *argv[1] == '-'){  //调试状态if (strcmp(argv[1] + 1, "debug") == 0 || strcmp(argv[1] + 1, "DEBUG") == 0){g_bDebug = TRUE;cout << "this is debug process" << endl;nRetCode = DebugProcess();}}else{                            //服务状态g_bDebug = FALSE;nRetCode = ServiceProcess(argc, argv);}return nRetCode;}



===========

0 0
原创粉丝点击