如何把一个程序注册成系统服务

//注册并启动/终止服务
BOOL RegisterServer(LPCTSTR lpServiceName,LPCTSTR lpDisplayName,LPCTSTR lpBinaryPathName)
{
    SC_HANDLE hSCManager = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
    if(hSCManager == NULL)
    {
        return FALSE;
    }

    if(CreateService(hSCManager,lpServiceName,lpDisplayName,
        SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,
        SERVICE_ERROR_NORMAL,lpBinaryPathName,NULL,NULL,NULL,NULL,NULL))
    {
        printf("RegisterServer.../r/n");

        CloseServiceHandle(hSCManager);        
        return TRUE;
    }
    else
    {
        printf("RegisterServer Error Code = %d/r/n",GetLastError());

        CloseServiceHandle(hSCManager);
        return FALSE;
    }
}

BOOL ExecuteService(LPCTSTR lpServiceName)
{
    SC_HANDLE hSCManager,hService;
    hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
    if(hSCManager == NULL)
    {
        return FALSE;
    }

    hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS);
    if(hService == NULL)
    {
        CloseServiceHandle(hSCManager);
        return FALSE;
    }

    if(StartService(hService,0,NULL))
    {
        printf("StartService.../r/n");

        CloseServiceHandle(hService);
        CloseServiceHandle(hSCManager);        
        return TRUE;
    }
    else
    {
        printf("StartService Error Code = %d/r/n",GetLastError());

        CloseServiceHandle(hService);
        CloseServiceHandle(hSCManager);
        return FALSE;
    }
}

BOOL TerminateService(LPCTSTR lpServiceName)
{
    SC_HANDLE hSCManager,hService;
    hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
    if(hSCManager == NULL)
    {
        return FALSE;
    }

    hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS);
    if(hService == NULL)
    {
        CloseServiceHandle(hSCManager);
        return FALSE;
    }

    if(StartService(hService,0,NULL))
    {
        SERVICE_STATUS ServerStatus;
        ControlService(hService,SERVICE_CONTROL_STOP,&ServerStatus);

        printf("TerminateService.../r/n");

        CloseServiceHandle(hService);
        CloseServiceHandle(hSCManager);        
        return TRUE;
    }
    else
    {
        printf("TerminateService Error Code = %d/r/n",GetLastError());

        CloseServiceHandle(hService);
        CloseServiceHandle(hSCManager);
        return FALSE;
    }
}

//要做成服务的EXE必须这样写

#include <stdio.h>
#include <windows.h>
#include <winsvc.h>

#define SERVERNAME "CooldogServer"

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceControl(DWORD nControlCode);
BOOL ExecuteService();
void TerminateService();
DWORD WINAPI ServiceProc(LPVOID lpParameter);
BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
                         DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint);

SERVICE_STATUS_HANDLE hServiceStatus; 
DWORD ServiceCurrentStatus;
HANDLE hServiceThread;
BOOL bServiceRunning;
HANDLE hServiceEvent;

void main(int argc, char* argv[])
{
    SERVICE_TABLE_ENTRY ServiceTable[] = 
    {
        {SERVERNAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
        {NULL,NULL}
    };

    if(!StartServiceCtrlDispatcher(ServiceTable))
    {
        printf("RegisterServer First");
    }
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
    hServiceStatus = RegisterServiceCtrlHandler(SERVERNAME,(LPHANDLER_FUNCTION)ServiceControl);
    if(!hServiceStatus || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000))
    {
        return;
    }

    hServiceEvent = CreateEvent(0,TRUE,FALSE,0);
    if(!hServiceEvent || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000))
    {
        return;
    }

    if(!ExecuteService())
    {
        return;
    }

    ServiceCurrentStatus = SERVICE_RUNNING;

    if(!UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0))
    {
        return;
    }

    WaitForSingleObject(hServiceEvent,INFINITE);
    CloseHandle(hServiceEvent);
}

void WINAPI ServiceControl(DWORD dwControlCode)
{
    switch(dwControlCode)
    {    
    case SERVICE_CONTROL_SHUTDOWN:
    case SERVICE_CONTROL_STOP:
        ServiceCurrentStatus = SERVICE_STOP_PENDING;
        UpdateServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,0,1,3000);
        TerminateService();        
        return;
    default:
        break;
    }
    
    UpdateServiceStatus(ServiceCurrentStatus,NO_ERROR,0,0,0);
}

BOOL ExecuteService()
{    
    DWORD dwThreadID;
    hServiceThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceProc,0,0,&dwThreadID);

    if(hServiceThread != NULL)
    {
        bServiceRunning = TRUE;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

void TerminateService()
{
    bServiceRunning = FALSE;
    SetEvent(hServiceEvent);
    UpdateServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0);
}

DWORD WINAPI ServiceProc(LPVOID lpParameter)//在这个函数里面添加你想要的操作
{
    while(bServiceRunning)
    {        
        Beep(450,150);
        Sleep(4000);
    }

    return 0;
}

BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
                         DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint)
{
    SERVICE_STATUS ServiceStatus;
    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    ServiceStatus.dwCurrentState = dwCurrentState;

    if(dwCurrentState == SERVICE_START_PENDING)
    {
        ServiceStatus.dwControlsAccepted = 0;
    }
    else
    {
        ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    }

    if(dwServiceSpecificExitCode == 0)
    {
        ServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
    }
    else
    {
        ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
    }

    ServiceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
    ServiceStatus.dwCheckPoint = dwCheckPoint;
    ServiceStatus.dwWaitHint = dwWaitHint;

    if(!SetServiceStatus(hServiceStatus,&ServiceStatus))
    {
        TerminateService();
        return FALSE;
    }

    return TRUE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值