vc windows服务

// 1  初始化 ServiceStatus、hStatus
// 2  服务表设置
// 3  创建并打开服务
/* 4 
    StartServiceCtrlDispatcher--在此进程中的服务表中所有服务进程结束前,此函数不返回;
创建(当前服务进程的)主线程的连接到SCM;SCM利用此连接给服务进程发送控制和启动请求;
此时,主线程成为进程的分配器线程,负责调用ServiceHandler来处理控制请求。当一个服务表中的服务开始时,此分配器线程启
动一个新的线程来执行 ServiceMain 服务函数;
具体的函数参数可以查阅MSDN。
*/


#include "stdafx.h"
#include "stdio.h"


SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hServiceStatus;


TCHAR szServiceName[] = _T("ServiceTest");


void WINAPI ServiceMain();  //服务主线程函数
void WINAPI ServiceHandler(DWORD dwOpcode);// 服务控制处理函数


void main()
{
// 1  初始化 ServiceStatus、hStatus
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;


// 2  服务表设置
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};


// 3 创建并打开服务
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);//打开服务控制管理器
TCHAR szFilePath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, MAX_PATH);// Get the executable file path
SC_HANDLE hService = ::CreateService(
hSCM, szServiceName, szServiceName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T(""), NULL, NULL);
SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);


// 4 连接当前线程到SCM;在此进程中的函数表所有进程结束前,此函数不返回
if (!::StartServiceCtrlDispatcher(st))
{
//LogEvent(_T("Register Service Main Function Error!"));
}


return 0;
}


void WINAPI ServiceMain()
{
// Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;


//注册服务控制
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceHandler);
if (hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
SetServiceStatus(hServiceStatus, &status);


status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status);


//模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
int i = 0;
while (i < 10)
{
Sleep(1000);
i++;
}
//
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);


}


void WINAPI ServiceHandler(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(hServiceStatus, &status);
PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
break;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
default:
LogEvent(_T("Bad service request"));
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值