C++快速创建Windows服务

C++快速创建Windows服务


       最简单的Windows服务可以是一个Win32控制台程序,创建一个Windows服务的流程如下:

  1. 创建一个空的Win32控制台程序;
  2. 新建一个cpp文件,将模板代码拷入文件中;
  3. 在服务的核心线程中添加工作代码自行扩展,并且编译工程生成exe文件;
  4. 在命令行中运行指令创建并运行服务;

    sc create service_demo binpath= “F:\service_demo.exe” displayname= “service_displayname”
    sc start service_demo

    注意:等号’=’后面要有一个空格


// windows服务模板
#include "Windows.h"

#define SERVICE_NAME "srv_demo"

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hServiceStatusHandle;
void WINAPI service_main(int argc, char** argv); 
void WINAPI ServiceHandler(DWORD fdwControl);

TCHAR szSvcName[80];
SC_HANDLE schSCManager;
SC_HANDLE schService;
int uaquit;
FILE* log;

DWORD WINAPI srv_core_thread(LPVOID para)
{   
    // 服务核心线程,将服务的工作代码放在此线程
    int i = 0;
    for(;;)
    {
        if(uaquit)
        {
            break; 
        }
        fprintf(log,"srv_core_thread run time count:%d\n",i++);
        Sleep(5000); 
    }    
   return NULL; 
}   


void WINAPI ServiceHandler(DWORD fdwControl)
{
switch(fdwControl) 
{
    case SERVICE_CONTROL_STOP:
    case SERVICE_CONTROL_SHUTDOWN:
    ServiceStatus.dwWin32ExitCode = 0; 
    ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
    ServiceStatus.dwCheckPoint    = 0; 
    ServiceStatus.dwWaitHint      = 0;
    uaquit= 1;
    //add you quit code here
    if(log != NULL)
    fclose(log);
    break; 
    default:
        return; 
};
    if (!SetServiceStatus(hServiceStatusHandle,  &ServiceStatus)) 
    { 
        DWORD nError = GetLastError();
    } 
}

void WINAPI service_main(int argc, char** argv) 
{       
    ServiceStatus.dwServiceType        = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; 
    ServiceStatus.dwWin32ExitCode      = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0;  
    hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler); 
    if (hServiceStatusHandle==0) 
    {
        DWORD nError = GetLastError();
    }  
    //add your init code here
    log = fopen("d:\\test.txt","w");
    //add your service thread here
    HANDLE task_handle = CreateThread(NULL,NULL,srv_core_thread,NULL,NULL,NULL);
    if(task_handle == NULL)
    {
        fprintf(log,"create srv_core_thread failed\n");
    }

    // Initialization complete - report running status 
    ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 9000;  
    if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus)) 
    { 
        DWORD nError = GetLastError();
    } 

} 
//do not change main function
int main (int argc, const char *argv[])
{
    SERVICE_TABLE_ENTRY ServiceTable[2];

    ServiceTable[0].lpServiceName = _T(SERVICE_NAME);
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // 启动服务的控制分派机线程
    StartServiceCtrlDispatcher(ServiceTable); 
    return 0;
}

参考:http://blog.csdn.net/chenyujing1234

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值