您的位置:首页 > 编程语言 > C语言/C++

C++ 后台服务程序

2014-04-21 16:14 344 查看
以下为网上收录的一个可用的c++后台服务代码。

附上个人的理解:

main里面主要做创建、移除、暂停和继续操作,操作做完之后,main函数就结束掉了(本例只有创建和移除操作,移除后需要重启,服务才会消失)。

如果是创建操作的话,创建完之后main结束点,但仍然会有一段服务器代码继续运行,如本例中的StartService函数里,创建了一个线程,执行具体操作。

暂停和继续操作可以是,结束掉这个线程和创建一个线程。

#include "windows.h"
#include <ctime>
using namespace std;
//全局变量
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE ServiceStatusHandle;
TCHAR szServiceName[] = _T("junkFilter");

//函数声明
void InstallService(char *szServicePath);
void removeService();
void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv);
void WINAPI ServiceControl(DWORD dwCode);
DWORD WINAPI Service(LPVOID lpvThread); //服务功能函数

int main(int argc, char* argv[])
{
//定义SERVICE_TABLE_ENTRY DispatchTable[] 结构
SERVICE_TABLE_ENTRY DispatchTable[2] =
{
{TEXT(szServiceName), ServiceStart},
{NULL, NULL}
};

//安装或者打开服务
StartServiceCtrlDispatcher(DispatchTable);

if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
{
if(_stricmp("install",argv[1]+1)==0)
{
InstallService(argv[0]);
}
else if(_stricmp("remove",argv[1]+1)==0)
{
removeService();
}
else
{
printf("%s - install to install the service \n",szServiceName);
printf("%s - remove to remove the service \n",szServiceName);
}
}

return 0;
}
//函数定义
void InstallService(char *szServicePath)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;
SERVICE_STATUS InstallServiceStatus;
DWORD dwErrorCode;

//打开服务管理数据库
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(schSCManager == NULL)
{
//Open Service Control Manager Database Failed!;
return;
}
//创建服务
schService = CreateService(
schSCManager,
TEXT(szServiceName),
TEXT(szServiceName),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
szServicePath,
NULL,
NULL,
NULL,
NULL,
NULL);
if(schService == NULL)
{
dwErrorCode = GetLastError();
if(dwErrorCode != ERROR_SERVICE_EXISTS)
{
//创建服务失败
CloseServiceHandle(schSCManager);
return;
}
else
{
//要创建的服务已经存在
schService = OpenService(schSCManager, TEXT(szServiceName), SERVICE_START);
if(schService == NULL)
{
//Open Service Failed!;
CloseServiceHandle(schSCManager);
return;
}
}
}
else
{
//Create Service Success!;
}
//启动服务
if(StartService(schService, 0, NULL)==0 )
{
//启动失败
dwErrorCode = GetLastError();
if(dwErrorCode == ERROR_SERVICE_ALREADY_RUNNING)
{
//Service already run!;
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
return ;
}
}
else
{
//Service pending
}

while(QueryServiceStatus(schService, &InstallServiceStatus) != 0)
{
if(InstallServiceStatus.dwCurrentState == SERVICE_START_PENDING)
{
//Sleep(100);
}
else
{
break;
}
}
if(InstallServiceStatus.dwCurrentState != SERVICE_RUNNING)
{
//Failure!
}
else
{
//Sucess!
}

//擦屁股
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
return;
}
//停止和删除已安装的服务程序
void removeService()
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
//打开服务管理数据库
schSCManager=OpenSCManager(
NULL, //本地计算机
NULL, //默认的数据库
SC_MANAGER_ALL_ACCESS //要求所有的访问权
);
if(schSCManager)
{
//获取服务程序句柄
schService=OpenService(
schSCManager, //服务管理数据库句柄
TEXT(szServiceName), //服务名
SERVICE_ALL_ACCESS //响应所有的访问请求
);
if(schService)
{
//试图停止服务
if(ControlService(
schService, //服务程序句柄
SERVICE_CONTROL_STOP, //停止服务请求码
&ServiceStatus //接收最后的服务状态信息
))
{
_tprintf(TEXT("Stopping %s."),TEXT(szServiceName));
Sleep(1000);

//等待服务停止
//
while(QueryServiceStatus(schService,&ServiceStatus))
{
if(SERVICE_STOP_PENDING==ServiceStatus.dwCurrentState)
{
_tprintf(TEXT("."));
Sleep(1000);
}
else
break;
}
if(SERVICE_STOPPED==ServiceStatus.dwCurrentState)
_tprintf(TEXT("\n %s stopped. \n"),TEXT(szServiceName));
else
_tprintf(TEXT("\n %s failed to stopp. \n"),TEXT(szServiceName));
}
//删除已安装的服务程序安装
if(DeleteService(schService))
_tprintf(TEXT("%s removed. \n"),TEXT(szServiceName));
else
_tprintf(TEXT("DeleteService failed - %s. \n"), GetLastError());
CloseServiceHandle(schService);
}
else
_tprintf(TEXT("OpenService failed - %s \n"),GetLastError());
CloseServiceHandle(schSCManager);
}
else
_tprintf(TEXT("OpenSCManager failed - %s \n"),GetLastError());
}
void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv)
{
HANDLE hThread;

ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;

ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

ServiceStatusHandle = RegisterServiceCtrlHandler(TEXT(szServiceName), ServiceControl);
if(ServiceStatusHandle == 0)
{
//error
return;
}

ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)
{
//SetServiceStatus error!
return;
}

//创建服务线程 服务完成的功能在这里调用
hThread = CreateThread(NULL,
0,
Service,
NULL,
0,
NULL);
if(hThread == NULL)
{
//CreateThread error!
return;
}
CloseHandle(hThread);
return;
}

//服务控制模块

void
aebd
WINAPI ServiceControl(DWORD dwCode)
{
switch(dwCode) {
case SERVICE_CONTROL_PAUSE:
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;

case SERVICE_CONTROL_CONTINUE:
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;

case SERVICE_CONTROL_STOP:
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)
{
//SetServiceStatus error!
}
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}

if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)
{
//SetServiceStatus error!
}

return ;
}

//服务线程函数
DWORD WINAPI Service(LPVOID lpvThread)
{
CJunkAnalyse junk;
time_t preUpdateTime = time(NULL)-junk.m_dbMinsAppend*60;

time_t preInsertTime = time(NULL)-junk.m_dbMinsAppend*60;

while(1)
{
time_t curTime = time(NULL);
if ((curTime-preUpdateTime)>junk.m_dbMinsAppend*60)
{
preUpdateTime = time(NULL);
// 获取新数据
junk.appendChatLog();
}
else
{
Sleep(5000);
}

if ((curTime-preInsertTime)>junk.m_dbMinsJudge*60)
{
preInsertTime = time(NULL);
// 获取新数据
junk.insertJunkChat();
}
else
{
Sleep(5000);
}
}

return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 服务器