#include "Server.h"
//---------------------------------------------------------------------------------
int main( int argc, char **argv )
{
Svr_Init();
DWORD dwThreadID = ::GetCurrentThreadId();
SERVICE_TABLE_ENTRY st[] =
{
{ SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)Svr_ServiceMain },
{ NULL, NULL }
};
LPSTR lpCmdLine = argv[1];
if ( argc == 2 )
{
BOOL bRet;
if (strcmp(lpCmdLine, "/install") == 0)
{
bRet = Svr_Install();
if ( bRet == TRUE )
{
printf( "Install service %s success", SERVICE_NAME );
}else
{
printf( "Install service %s failed", SERVICE_NAME );
}
}
else if (strcmp(lpCmdLine, "/uninstall") == 0)
{
bRet = Svr_Uninstall();
if ( bRet == TRUE )
{
printf( "Uninstall service %s success", SERVICE_NAME );
}else
{
printf( "Uninstall service %s failed", SERVICE_NAME );
}
}else if (strcmp(lpCmdLine, "/start") == 0)
{
bRet = Svr_Start();
if ( bRet == TRUE )
{
printf( "Start service %s success", SERVICE_NAME );
}else
{
printf( "Start service %s failed", SERVICE_NAME );
}
}else if (strcmp(lpCmdLine, "/stop") == 0)
{
bRet = Svr_Stop();
if ( bRet == TRUE )
{
printf( "Stop service %s success", SERVICE_NAME );
}else
{
printf( "Stop service %s failed", SERVICE_NAME );
}
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
//Register Service Main Function Error!
;
}
}
}else
{
if (!::StartServiceCtrlDispatcher(st))
{
//Register Service Main Function Error!
;
}
}
return 0;
}
#include "Server.h"
HANDLE hEvent = INVALID_HANDLE_VALUE;
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hServiceStatus;
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
void Svr_Init()
{
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;
}
int Svr_IsInstalled()
{
BOOL bResult = FALSE;
//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM != NULL)
{
//打开服务
SC_HANDLE hService = ::OpenService(hSCM, SERVICE_NAME, SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
bResult = TRUE;
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
return bResult;
}
int Svr_Install( )
{
if( Svr_IsInstalled() )
return TRUE;
//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
return FALSE;
}
// Get the executable file path
TCHAR szFilePath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, MAX_PATH);
//创建服务
SC_HANDLE hService = ::CreateService(
hSCM,
SERVICE_NAME,
SERVICE_NAME,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
SERVICE_ERROR_NORMAL,
szFilePath,
NULL,
NULL,
TEXT(""),
NULL,
NULL);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
return FALSE;
}
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
int Svr_Uninstall( )
{
if (!Svr_IsInstalled())
return TRUE;
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
return FALSE;
}
SC_HANDLE hService = ::OpenService(hSCM, SERVICE_NAME, SERVICE_STOP | DELETE);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status);
//删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
if (bDelete)
return TRUE;
//Service could not be deleted
return FALSE;
}
int Svr_Start( )
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if (hSCM!=NULL)
{
hService=OpenService( hSCM, SERVICE_NAME, SERVICE_START);
if (hService!=NULL)
{
//开始Service
bRet = StartService(hService,0,NULL);
CloseServiceHandle(hService);
}else
{
bRet = FALSE;
}
CloseServiceHandle(hSCM);
}else
{
bRet = FALSE;
}
return bRet;
}
int Svr_Stop( )
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus;
hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if (hSCM!=NULL)
{
hService=OpenService( hSCM, SERVICE_NAME, SERVICE_STOP|SERVICE_QUERY_STATUS );
if (hService!=NULL)
{
QueryServiceStatus( hService, &ServiceStatus );
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
}else
{
bRet = FALSE;
}
CloseServiceHandle( hService );
}else
{
bRet = FALSE;
}
CloseServiceHandle( hSCM );
}else
{
bRet = FALSE;
}
return bRet;
}
void WINAPI Svr_ServiceMain( )
{
// Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
//注册服务控制
hServiceStatus = RegisterServiceCtrlHandler( SERVICE_NAME, Svr_ServiceStrl);
if (hServiceStatus == NULL)
{
//Handler not installed
return;
}
SetServiceStatus(hServiceStatus, &status);
//如下代码可以为启动服务前的准备工作
hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
if ( hEvent == NULL )
{
//Failure to start service
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
return;
}
//
//更改服务状态为启动
status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status);
char log[256] = {0};
//等待用户选择停止服务
while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 )
{
//Service runing...
//模拟服务的运行,应用时将主要任务放于此即可
//printf("test!");
gettime(log);
writelog(log);
memset(log, 0, 256);
//Sleep(1000);
}
//Service stopped
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
}
void WINAPI Svr_ServiceStrl( DWORD dwOpcode )
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(hServiceStatus, &status);
//告诉服务线程停止工作
::SetEvent( hEvent );
break;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
default:
//Bad service request
break;
}
}
void writelog(char *log)
{
FILE *fp;
fp = fopen("D:\\log.txt", "a");
if (fp != NULL)
{
fprintf(fp, "%s\n", log);
}
if (fp)
{
fclose(fp);
}
}
void gettime(char *time)
{
SYSTEMTIME s_time;
GetLocalTime(&s_time);
sprintf(time, "%04d/%02d/%02d %02d:%02d:%02d", s_time.wYear, s_time.wMonth, s_time.wDay, s_time.wHour, s_time.wMinute, s_time.wSecond);
}
#ifndef SERVER_H_
#define SERVER_H_
#include "stdio.h"
#include <windows.h>
//----------------------------------------------------------------------------
#define SERVICE_NAME TEXT("TEST Licence Server")
#ifdef __cplusplus
extern "C"
{
#endif
//----------------------------------------------------------------------------
void Svr_Init();
int Svr_IsInstalled();
int Svr_Install( );
int Svr_Uninstall( );
int Svr_Start( );
int Svr_Stop( );
void WINAPI Svr_ServiceMain( );
void WINAPI Svr_ServiceStrl( DWORD dwOpcode );
//----------------------------------------------------------------------------
//
#ifdef __cplusplus
}
void writelog(char *log);
void gettime(char *time);
#endif
//----------------------------------------------------------------------------
#endif
服务程序的安装卸载可以通过命令行输入参数执行具体函数来进行,或者使用系统自带命令SC来进行
安装脚本:
sc create "TEST Licence Server" binpath= "E:\TestCode\TestServer\Debug\TestServer.exe" DisplayName= "TEST Licence Server" depend= Tcpip start= auto
sc description "TEST Licence Server" "测试代码"
pause
卸载脚本:
sc stop "Test Licence Server"
sc delete "Test Licence Server"
pause