编写windows服务程序

初学VC,写了一个最简单的服务程序,windows API 真心太多了,留作笔记。以后说不定改改还能用上。

编译后生成exe文件:

test.exe -i   //安装服务

test.exe -r   //删除服务


while循环中写自己的逻辑。

**注意!! 每次代码改变服务状态后一定表忘记SetServiceStatus一下,不然真报错不商量。

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

BOOL flag = TRUE;
void WINAPI ServiceMain(DWORD argc, LPSTR** argv);
void WINAPI sHandler(DWORD request);
BOOL installService();
BOOL unInstallService();

SERVICE_STATUS m_Status;
SERVICE_STATUS_HANDLE m_Handle;

int main(int argc,char* argv[]) 
{

	if (argc==2)
	{
		if (!_stricmp(argv[1],"-i"))
		{
			installService();
		}
		else if(!_stricmp(argv[1],"-r"))
		{
			unInstallService();
		}
		return 0;
	}


	SERVICE_TABLE_ENTRY table[2];
	table[0].lpServiceName = "AAA";
	table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
	table[1].lpServiceName = NULL;
	table[1].lpServiceProc = NULL;

	StartServiceCtrlDispatcher(table);


}

void WINAPI ServiceMain(DWORD argc, LPSTR ** argv)
{
	m_Status.dwCheckPoint = 0;
	m_Status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
	m_Status.dwCurrentState = SERVICE_START_PENDING;
	m_Status.dwServiceSpecificExitCode = 0;
	m_Status.dwServiceType = SERVICE_WIN32;
	m_Status.dwWaitHint = 0;
	m_Status.dwWin32ExitCode = 0;

	m_Handle = RegisterServiceCtrlHandler("AAA",sHandler);


	if (m_Handle!=0)
	{
		m_Status.dwCurrentState = SERVICE_RUNNING;
	}
	SetServiceStatus(m_Handle, &m_Status);
	while (flag)
	{
		FILE *fp;
		fp = fopen("c:\\demo\\test.txt", "a+");
		fputs("test data!\r\n",fp);
		fclose(fp);
		Sleep(10000);
	}
	CloseServiceHandle(m_Handle);
}

void WINAPI sHandler(DWORD request)
{
	switch (request)
	{
	case SERVICE_CONTROL_STOP:
		flag = FALSE;
		m_Status.dwCurrentState = SERVICE_STOPPED;
		break;
	case SERVICE_CONTROL_SHUTDOWN:
		flag = FALSE;
		m_Status.dwCurrentState = SERVICE_STOPPED;
		break;
	default:
		break;
	}

	SetServiceStatus(m_Handle, &m_Status);
}

BOOL installService()
{
	SC_HANDLE scHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (scHandle==NULL)
	{
		printf("openSCManager failed!");
		return FALSE;
	}
	scHandle = CreateService(scHandle, "AAA", NULL, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, "c:\\demo\\AAA.exe", NULL, NULL, NULL, NULL, NULL);

	if (scHandle == NULL)
	{
		printf("createService failed!");
		return FALSE;
	}
	printf("createService success!\r\n");
	
	if (StartService(scHandle, NULL, NULL)) 
	{
		printf("start service success!\r\n"); 
	}
	else
	{
		printf("start failed!");
	}
	CloseServiceHandle(scHandle);
	return TRUE;
}

BOOL unInstallService()
{
	SC_HANDLE scm, m_service;
	SERVICE_STATUS unStatus;
	scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (scm==NULL)
	{
		printf("openscmanage failed!");
		return FALSE;
	}
	else
	{
		m_service = OpenService(scm, "AAA", SC_MANAGER_ALL_ACCESS);
		if (m_service==NULL)
		{
			printf("openservice failed!");
			return FALSE;
		}
		else
		{
			if (QueryServiceStatus(m_service, &unStatus))
			{
				if (unStatus.dwCurrentState!=SERVICE_STOPPED)
				{
					if (!ControlService(m_service, SERVICE_CONTROL_STOP, &unStatus))
					{
						printf("controlservice stop failed!");
						return FALSE;
					}
				}
				if (DeleteService(m_service))
				{
					printf("Delete success!");
				}
				else
				{
					printf("Delete failed!");
					return FALSE;
				}
			}
			else
			{
				printf("Queryservice failed!");
				return FALSE;
			}
		}
	}
	
	return TRUE;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值