控制台程序转成windows 服务简单的辅助代码

#ifndef daemon_h
#define daemon_h

#include <windows.h>

static SERVICE_STATUS daemon_status;;
static SERVICE_STATUS_HANDLE daemon_handle;
static DWORD deamon_argc;
static char** daemon_argv;
extern const char* daemon_name;

static void WINAPI daemon_ctrl(DWORD dwControl){
    switch (dwControl){
        case SERVICE_CONTROL_PAUSE:
            daemon_status.dwCurrentState = SERVICE_PAUSE_PENDING;
            SetServiceStatus(daemon_handle, &daemon_status);
            daemon_status.dwCurrentState = SERVICE_PAUSED;
            break;

        case SERVICE_CONTROL_CONTINUE:
            daemon_status.dwCurrentState = SERVICE_CONTINUE_PENDING;
            SetServiceStatus(daemon_handle, &daemon_status);
            daemon_status.dwCurrentState = SERVICE_RUNNING;
            break;

        case SERVICE_CONTROL_STOP:
            daemon_status.dwCurrentState = SERVICE_STOP_PENDING;
            SetServiceStatus(daemon_handle, &daemon_status);
            daemon_status.dwCurrentState = SERVICE_STOPPED;
            break;

        case SERVICE_CONTROL_SHUTDOWN:
            break;

        case SERVICE_CONTROL_INTERROGATE:
            daemon_status.dwCurrentState = SERVICE_RUNNING;
            break;
    }
    SetServiceStatus(daemon_handle, &daemon_status);
}

static int daemon_initialize(){
    daemon_status.dwServiceType = SERVICE_WIN32;
    daemon_status.dwCurrentState = SERVICE_START_PENDING;
    daemon_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    daemon_status.dwWin32ExitCode = 0;
    daemon_status.dwServiceSpecificExitCode = 0;
    daemon_status.dwCheckPoint = 0;
    daemon_status.dwWaitHint = 0;

    daemon_handle = RegisterServiceCtrlHandler(daemon_name, daemon_ctrl);
    if(daemon_handle == 0){
        return -1;
    }

    daemon_status.dwCheckPoint = 0;
    daemon_status.dwWaitHint = 0;
    daemon_status.dwCurrentState = SERVICE_RUNNING;
    SetServiceStatus(daemon_handle, &daemon_status);

    return 0;
}

#define main                                                /
main(int argc, char* argv[]){                               /
    deamon_argc = argc;                                     /
    daemon_argv = argv;                                     /
    void WINAPI daemon_wrapper(DWORD argc, char* argv[]);   /
    SERVICE_TABLE_ENTRY service_table_entry[] =             /
    {                                                       /
        {(char *) daemon_name, daemon_wrapper},             /
        {0, 0}                                              /
    };                                                      /
    StartServiceCtrlDispatcher(service_table_entry);        /
}                                                           /
                                                            /
void WINAPI daemon_wrapper(DWORD argc, char* argv[]){       /
    if(-1 == daemon_initialize()){                          /
        return;                                             /
    }                                                       /
    extern int daemon_main(int argc, char* argv[]);         /
    daemon_main((int) deamon_argc, daemon_argv);            /
}                                                           /
int daemon_main

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值