VC 服务程序编程

 

       所谓服务程序,就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。下面就跟着我一步一步地教你怎么去创建一个服务应用程序吧。

      主要使用到的函数(详情请看MSDN):

                          

1.OpenSCManager:打开服务管理器

 

WINADVAPI
SC_HANDLE
WINAPI
OpenSCManager(
    __in_opt        LPCSTR                lpMachineName,//计算机名,NULL表示本地计算机
    __in_opt        LPCSTR                lpDatabaseName,//数据库名,默认值是SERVICES_ACTIVE_DATABASE 
    __in            DWORD                   dwDesiredAccess//访问权限
    );

     参数dwDesiredAccess的取值有:

        SC_MANAGER_CONNECT         //可连接      

        SC_MANAGER_CREATE_SERVICE    //能创建服务

        SC_MANAGER_ENUMERATE_SERVICE   
        SC_MANAGER_LOCK                       
        SC_MANAGER_QUERY_LOCK_STATUS   
        SC_MANAGER_MODIFY_BOOT_CONFIG 

 

  2.CreateService:创建服务

    WINADVAPI
    SC_HANDLE
    WINAPI
    CreateService(
    __in        SC_HANDLE    hSCManager,//服务管理器
    __in        LPCSTR     lpServiceName,  //服务名
    __in_opt    LPCSTR     lpDisplayName,//显示名字
    __in        DWORD        dwDesiredAccess,//访问权限
    __in        DWORD        dwServiceType,//服务类型,见MSDN
    __in        DWORD        dwStartType,//怎么启动的?
    __in        DWORD        dwErrorControl,
    __in_opt    LPCSTR     lpBinaryPathName,//启动路径
    __in_opt    LPCSTR     lpLoadOrderGroup,
    __out_opt   LPDWORD      lpdwTagId,
    __in_opt    LPCSTR     lpDependencies,
    __in_opt    LPCSTR     lpServiceStartName,
    __in_opt    LPCSTR     lpPassword
    );

    3.其他函数

                 OpenService:打开服务

                  ControlService:控制服务

                    DeleteService:删除服务

                      RegisterServiceCtrlHandler:注册服务控件句柄,返回的是服务状态类型

                         SetServiceStatus 设置服务状态信息

                             StartServiceCtrlDispatcher:在主线程里面开始服务指派

 

    下面通过实例说明一下:

               》声明成员变量:

                    SERVICE_STATUS_HANDLE m_hServiceStatus;

               》创建服务

                      BOOL  Install()            //安装服务

                           {

                              SC_HANDLE hSCM= OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);

                               if (!hSCM)//打开服务管理器失败
                                     return FALSE;

                                   //创建服务
                       SC_HANDLE hService = ::CreateService(
                                                     hSCM, szServiceName, szServiceName,
                                                     SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
                                                      SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
                                                        szFilePath, NULL, NULL, _T(""), NULL, NULL);

 

                                           ChangeServiceConfig2(.............);//还可以配置服务的信息

                                          //最后要关闭句柄

                                           ::CloseServiceHandle(hService);
                                           ::CloseServiceHandle(hSCM);

 

                           }

                     

                        BOOL Uninstall()//卸载服务
                         {
                         ..................
                        OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
                        //打开服务
                       OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
                       //停止服务
                         ControlService(hService, SERVICE_CONTROL_STOP, &status);
                        //删除服务
                        DeleteService(hService);

 

                       ::CloseServiceHandle(hService);
                       ::CloseServiceHandle(hSCM);
                        } 

 

<>添加服务主线程函数和控制函数。这里调用 RegisterServiceCtrlHandler 来注册服务的控制函数,这里要设置status.dwControlsAccepted 为 SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。

 

void WINAPI ServiceMain()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制

    //注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
    if (hServiceStatus == NULL)
    {
        LogEvent(_T("Handler not installed"));
        return;
    }
    SetServiceStatus(hServiceStatus, &status);

    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
    status.dwCurrentState = SERVICE_RUNNING;
    SetServiceStatus(hServiceStatus, &status);

    //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
    int i = 0;
    while (i < 10)
    {
           Sleep(1000);
           i++;
    }
    //

    status.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hServiceStatus, &status);
    LogEvent(_T("Service stopped"));
}

 

《》最后我们需要在主函数,或者应用程序的Main函数里面注册,安装,卸载服务。。。

 

   加入下面的代码:

。。。。。。。。。。。。。。。。

 

    ParseCommandLine(m_trCmdInfo);//得到命令参数lpCmdLine

  

          SERVICE_TABLE_ENTRY st[] =
    {
        { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
        { NULL, NULL }
    };

       if (stricmp(lpCmdLine, "/install") == 0)
     {
            Install();
     }
     else if (stricmp(lpCmdLine, "/uninstall") == 0)
     {
            Uninstall();
     }
     else
    {
              StartServiceCtrlDispatcher(st);
     }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章