浅谈服务程序的编写

服务是一种在系统中常驻的程序,服务可以在系统启动时自启动。当一个应用程序需要常驻在系统,或者随时为其他应用程序提供服务时,可以使用服务应用程序。

我们可以通过“控制面板”->“管理工具"->"服务"来查看系统中所有服务的状态。

说到服务,就要说到”服务控制器(SCM)"。服务控制器对系统中所有的服务进行管理,SCM管理着系统中已经安装的服务程序和设备驱动程序数据库,数据库中保存的信息包括系统安装了那些服务,每个服务包括如何启动每个服务、各个服务的安全属性以及控制接口等。

一个服务具有若干个属性,包括服务名称、显示名称、服务类型、描述、可执行文件路径、启动类型、服务状态、启动参数、依存关系等。我们就不多介绍了。

下面我们讲讲如何编写服务程序。

一个服务程序至少包括入口函数、服务主函数和控制处理函数。

服务主函数有两个,一个是ServiceMain函数,一个是StartServiceCtrlDispatcher函数。

控制处理函数包括两个,一个是控制处理函数Handler,一个是注册控制管理函数RegisterServiceCtrlHandler.详细的解释就请各位到百度搜一下吧。下面我写一个测试程序。大家有空就看一下。

一个控制台的服务类程序。Service.c:


#include <windows.h>  //头文件

SERVICE_STATUS  SplSrvServiceStaus;  //全局变量

SERVICE_STATUS SplSrvServiceStatusHandle; //全局变量 

//函数声明

VOID SvcDebugOut(LPSTR String,DWORD Status);

VOID WINAPI SplSrvServiceCtrlHandler(DWORD opcode);

VOID WINAPI SplSrvServiceStart(DWORD argc,LPTSTR *argv,DWORD *specificError);


//服务启动函数

VOID WINAPI SplSrvServiceStart(DWORD argc,LPTSTR *argv)

{

         DWORD status;

         DWORD specificError;

         //填充SERVICE_STATUA结构

        SplSrvServiceStatus.dwServiceType = SERVICE_WIN32;

        SplSrvServiceStatus.dwCurrentState = SERVICE_START_PENDING;  //服务在运行

        SplSrvServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;

        SplSrvServiceStatus.dwWin32ExitCode = 0;

        SplSrvServiceStatus.dwServiceSpecificExitCode = 0;

        SplSrvServiceStatus.dwCheckPoint = 0;

        SplSrvServiceStatus.dwWaitHint = 0;

        //注册服务控制请求处理列程

        SplSrvServiceStatusHandle = RegisterServiceCtrlHandle("Sample_Srv" //服务名

        ,SplSrvServiceCtrlHandle);//函数名

        if(SplSrvServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)

        {

                 SvcDebugOut("  [SPLSRV_SERVICE]  RegisterServiceCtrlHandler  failed %d\n",GetLastError());

                return ;

        }

        //初始化工作,本示例未用,函数为空

        status = SplSrvServiceInitialization(argc,argv,&specificError);

        //初始化出错,用户自行修改

       if(status != NO_ERROR)

       {

             SplSrvServiceStatus.dwCurrentState = SERVICE_STOPPED;

             SplSrvServiceStatus.dwCheckPoint = 0;

             SplSrvServiceStatus.dwWaitHint = 0;

             SplSrvServiceStatus.dwWin32ExitCode = status;

             SplSrvServiceStaus.dwServiceSpecificExitCode = specificError;

             SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus);

             return ;

      }

      //初始化完成,设置运行状态

      SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING;

      SplSrvServiceStatus.dwCheckPoint = 0;

      SplSrvServiceStatus.dwWaitHint = 0;

      if(!SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus))

      {

             status = GetLastError();

             SvcDebugOut("  [SPLSRV_SERVICE] SetServiceStatus error %ld\n",status);

      }


      //用户自行修改,用于完成服务的工作

      SvcDebug("    [SPLSRV_SERVICE]   Returning the Main Thread \n",0);

      return ;

}

//初始化函数

DWORD SplSrvServiceInitialization(DWORD argc,LPTSTR *argv,DWORD specificError)

{

         return 0;

}


//服务器请求处理函数

VOID WINAPI SplSrvServiceCtrlHandle(DWORD Opcode)

{

         DWORD status;

         switch(Opcode)

         {

                  case SERVICE_CONTROL_PAUSE:

                                       //完成相关功能

                                       SplSrvServiceStatus.dwCurrentState = SERVICE_PAUSED;

                                       break;

                  case SERVICE_CONTROL_CONTINUE:

                                      //完成相关功能

                                      SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING;

                                      break;

                  case SERVICE_CONTROL_STOP:

                                      //完成相关功能

                                      SplSrvServiceStatus.dwWin32ExitCode = 0;

                                      SplSrvServiceStatus.dwCurrentState = SERVICE_STOPPED;

                                      SplSrvServiceStatus.dwCheckPoint =0;

                                      SplSrvServiceStatus.dwWaitHint = 0;


                                     if(!SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus))

                                      {

                                                status = GetLastError();

                                                SvcDebugOut("  [SPLSRV_SERVICE]      SetServiceStatus error %ld\n",status);

                                      }

                                      SvcDebugout("   [SPLSRV_SERVICE]  Leaving SplSrvService \n",0);

                                      return ; 

                  case SERVICE_CONTROL_INTERROGATE:

                                     //收到此请求后复出声响,演示服务控制请求的处理过程,

                                     MessageBox(MB_OK);

                                    break;

                   default:

                                      SvcDebugout("   [SPLSRV_SERVICE]   Unrecognized opcode %ld\n",Opcode);

         }


          //当前状态

          if(!SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus))

          {

                     status = GetLastError();

                     SvcDebugOut("    [SPLSRV_SERVICE] SetServiceStatus error %ld\n",status);

          }

         return ;

}


//程序入口函数

void main()

{

           //设置SERVICE_TABLE_ENTRY数据结构,以NULL结构结束

           //作为StartServiceCtrlDispatcher函数的参数

           SERVICE_TABLE_ENTRY DispatchTable[] =

          {

                    {  "Sample_Srv",(LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart  },

                    {  NULL,NULL }

          };

          if(!StartServiceCtrlDispatcher(DispatchTable))

          {

                    SvcDebugOut("   [SPLSRV_SERVICE]  StartServiceCtrlDispatcher (%d)\n",GetLastError());

          }

}


//显示信息给调试器

VOID SvcEgbugOut(LPSTR Stringm,DWORD Status)

{

          CHAR Buffer[1024];

          if(strlen(String) < 1000)

         {

                 wsprintf(Buffer,String,Status);

                 OutputdebugString(Buffer);

         }

}




































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAQUS用户子程序是用于对ABAQUS软件进行定制化开发的工具,可以实现用户自定义的功能和算法。用户子程序pdf则是对ABAQUS用户子程序进行详细讲解的文档,可以帮助用户了解和使用用户子程序。 首先,用户子程序是ABAQUS软件的一个重要扩展功能,通过用户子程序,可以使用Fortran或C++等编程语言编写自己的算法和模型,并将其集成到ABAQUS中。用户子程序的开发可以满足用户特定的需求,扩展ABAQUS的功能,实现更复杂的模拟和分析。 用户子程序pdf是ABAQUS官方提供的详细文档,其主要内容包括用户子程序编写的基本概念、开发的流程、编程语言的要求以及具体使用的方法和技巧等。它通常会提供一些示例代码,用于演示如何使用用户子程序实现某些功能。用户可以根据文档的指导,学习和理解用户子程序的使用方法,并将其应用于自己的工程实际中。 用户子程序pdf的作用是帮助用户深入理解和掌握ABAQUS用户子程序的使用方法,可以节省用户的学习和开发成本。通过阅读文档,用户可以了解到用户子程序的原理和特点,学会如何编写、编译和调用用户子程序,并能够在实际使用中解决遇到的问题。用户子程序pdf还提供了一些技巧和注意事项,帮助用户充分发挥用户子程序的功能和性能。 总之,ABAQUS用户子程序pdf是一个重要的学习和参考资料,对于想要使用并扩展ABAQUS功能的用户来说,它是必不可少的。通过学习用户子程序pdf,用户可以掌握用户子程序的开发和使用技巧,为工程实践提供更强大和定制化的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值