Windows服务程序结构

#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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值