demo下载地址:https://download.csdn.net/download/2403_83063732/88987173
1、全局变量声明
#define SERVICENAME "TestService"//定义服务的名称
SERVICE_STATUS_HANDLE g_hServiceStatus = NULL;//当前服务的HANDLE
SERVICE_STATUS g_ServiceStatus = { 0 };//当前服务的状态数据
DWORD g_dwThreadID = 0;//线程ID用于关闭服务的时候使用
static FILE *g_logfp = NULL;//日志文件句柄
2、安装服务函数
//安装服务函数
BOOL Install()
{
//检测是否安装过
if (IsInstalled())
{
LogEvent("[%s] has IsInstalled\r\n", SERVICENAME);
return TRUE;
}//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
LogEvent("Couldn't open service[%s] manager\r\n", SERVICENAME);
return FALSE;
}//获取程序目录
TCHAR szFilePath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, MAX_PATH);
std::wstring wszPath ;
wszPath = szFilePath;
wszPath += L" /run";
//创建服务
SC_HANDLE hService = ::CreateService(
hSCM,
to_wide_string(SERVICENAME).c_str(),
to_wide_string(SERVICENAME).c_str(),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,自动启动方式
SERVICE_ERROR_NORMAL,
wszPath.c_str(),
NULL, NULL,NULL, NULL, NULL);//检测创建是否成功
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
LogEvent("Couldn't create service[%s]\r\n", SERVICENAME);
return FALSE;
}
LogEvent("[%s] CreateService Succ / Install Succ\r\n", SERVICENAME);
//释放资源
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
3、启动服务函数
void StartDefService()
{
SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (schSCManager == NULL) return ;
SC_HANDLE hService = OpenService(schSCManager, to_wide_string(SERVICENAME).c_str(), SERVICE_ALL_ACCESS);
if (hService == NULL) return ;// 开启服务
::StartService(hService, NULL, NULL);::CloseServiceHandle(hService);
::CloseServiceHandle(schSCManager);
}
4、实际服务程序运行以及运行函数
else if (_stricmp(argv[1], "/run") == 0)
{
GlobalDataInit();
g_dwThreadID = ::GetCurrentThreadId();
std::wstring wstrName = to_wide_string(SERVICENAME);
LogEvent("[%s] run\r\n", SERVICENAME);
SERVICE_TABLE_ENTRY st[] =
{
{ (LPWSTR)(wstrName.c_str()), (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};if (!::StartServiceCtrlDispatcher(st))
{
LogEvent("Register Service Main Function Error! [%x]\r\n", GetLastError());
}
}
运行的主函数
//服务主函数,这在里进行控制对服务控制的注册
void WINAPI ServiceMain()
{
//注册服务控制
g_hServiceStatus = RegisterServiceCtrlHandler(to_wide_string(SERVICENAME).c_str(), ServiceStrl);
if (g_hServiceStatus == NULL)
{
LogEvent("Handler not installed\r\n");
return;
}
g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);
ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);
//模拟服务的运行。应用时将主要任务放于此即可
//可在此写上服务需要执行的代码,一般为死循环
while (1)
{
SYSTEMTIME st;
GetSystemTime(&st);
LogEvent("%4d-%02d-%02d %02d:%02d:%02d Service Run\r\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);Sleep(1000);
}
ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
}
5、停止服务
// 停止服务
void StopDefService()
{
SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (schSCManager == NULL) return ;
SC_HANDLE hService = OpenService(schSCManager, to_wide_string(SERVICENAME).c_str(), SERVICE_ALL_ACCESS);
if (hService == NULL) return ;SERVICE_STATUS status;
// 停止服务
ControlService(hService, SERVICE_CONTROL_STOP, &status);::CloseServiceHandle(hService);
::CloseServiceHandle(schSCManager);
}
6、卸载服务
//删除服务函数
BOOL Uninstall()
{
//检测是否安装过
if (!IsInstalled())
{
LogEvent("[%s] has not Installed\r\n", SERVICENAME);
return TRUE;
}//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
LogEvent("Couldn't open service[%s] manager\r\n", SERVICENAME);
return FALSE;
}//打开具体服务
SC_HANDLE hService = ::OpenService(hSCM, to_wide_string(SERVICENAME).c_str(), SERVICE_STOP | DELETE);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
LogEvent("Couldn't open service[%s]\r\n", SERVICENAME);
return FALSE;
}//先停止服务
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status);//删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);if (bDelete)
{
LogEvent("Service deleted Succ[%s]\r\n", SERVICENAME);
return TRUE;
}
LogEvent("Service could not be deleted\r\n");
return FALSE;
}
7、测试方法
TestService.exe /install 安装服务
TestService.exe /start启动服务
TestService.exe /stop停止服务
TestService.exe /uninstall 卸载服务