Windows服务程序结构

来源:互联网 发布:unity3d awake start 编辑:程序博客网 时间:2024/06/07 23:56
#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_STATUSstatus;SERVICE_STATUS_HANDLEhServiceStatus;//---------------------------------------------------------------------------------//---------------------------------------------------------------------------------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_NAMETEXT("TEST Licence Server")#ifdef __cplusplusextern "C"{#endif    //----------------------------------------------------------------------------    voidSvr_Init();    intSvr_IsInstalled();    intSvr_Install( );    intSvr_Uninstall( );    intSvr_Start( );    intSvr_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= autosc description "TEST Licence Server" "测试代码"pause

卸载脚本:

sc stop "Test Licence Server"sc delete "Test Licence Server"pause


执行成功后可以在服务中看到 TEST License Server 服务。


0 0
原创粉丝点击