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

一、更新

(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;
}



===========

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值