C++快速创建Windows服务

来源:互联网 发布:手机剪裁照片的软件 编辑:程序博客网 时间:2024/06/05 20:20

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 functionint 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

原创粉丝点击