windows服务程序编写

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


/*
//创建一个服务,并设置自动启动
sc create TestAppServer binpath= C:\ServerApp.exe start= auto

//启动服务
sc start TestAppServer

//停止服务
sc stop TestAppServer

//删除服务
sc delete TestAppServer
*/

#define SLEEP_TIME 5000 //间隔时间
#define FILE_PATH "C:\\log.txt" //信息输出文件
bool brun = false;
SERVICE_STATUS servicestatus;
SERVICE_STATUS_HANDLE hstatus;



int WriteToLog(char* str);
void WINAPI ServiceMain(int argc, char** argv);
void WINAPI HandlerEx(_In_ DWORD  dwControl, _In_ DWORD  dwEventType, _In_ LPVOID lpEventData, _In_ LPVOID lpContext);

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 = RegisterServiceCtrlHandlerEx(TEXT("TestAppServer"), (LPHANDLER_FUNCTION_EX)HandlerEx, NULL);

	if (hstatus == 0)
	{
		WriteToLog("RegisterServiceCtrlHandler failed");
		return;
	}

	WriteToLog("RegisterServiceCtrlHandler success");

	//向SCM 报告运行状态

	servicestatus.dwCurrentState = SERVICE_RUNNING;
	SetServiceStatus(hstatus, &servicestatus);

	//下面就开始任务循环了,你可以添加你自己希望服务做的工作

	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, "available memory is %dMB", availmb);
		WriteToLog(str);
		Sleep(SLEEP_TIME);
	}
	WriteToLog("service stopped");

}




void WINAPI HandlerEx (_In_ DWORD  dwControl, _In_ DWORD  dwEventType, _In_ LPVOID lpEventData, _In_ LPVOID lpContext)
{

	switch (dwControl)
	{
	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);
}

void main()
{
	SERVICE_TABLE_ENTRY entrytable[1];
	entrytable[0].lpServiceName = TEXT("TestAppServer");
	entrytable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
	StartServiceCtrlDispatcher(entrytable);
	return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值