2007年1月31日星期三

NT Service 框架改进版(淡月儿)

      
      
Q :     NT Service 框架改进版(淡月儿)
主要解答者:     danyueer     提交人:     danyueer
感谢:     beyondtkl、msdn_user、fengge8ylf、vcleaner、Trashy、fzd999、flyelf、beyondtkl、CoolSlob、CoolSlob、alon21
审核者:     fzd999     社区对应贴子:     查看
     A :

上一篇IPC入侵,提到Service,建议是用花差的框架。后来仔细看了一下,他的服务框架很简单,结构不合理,缺乏安装、卸载处理,所以在他的基础上重构了一下,加进了安装、卸载过程,可以满足一般要求,当然,输出方面还存在改进的余地,版本定为ServiceFrame  V2.0。  
 
欢迎大家提意见,互相交流学习,顺便BS一下花差花差~呵呵  
 
说明:  
1  这是一个NT系统服务的框架,其中包括了完整的安装、卸载过程。  
2  命令行参数决定了本程序的行为,其中  -?  是帮助参数,你可以输入这个参数来查看其他命令行参数的含义,也可以通过自己阅读代码,来理解各个命令行参数的作用。  
3  本程序采用了面向对象的一些模式,但由于考虑到只是一个框架,因此没有在输出上进行优化,你如果有兴趣,可以自己尝试设计完整的输出模式,比如输出到文件,或者输出到系统日志等……  
 
本程序在Windows2000Professional操作系统下调试通过。 1.0版本不支持命令行,2.0版本支持通过命令行安装和卸载。你如果发现Bug请及时告诉我,我会以最快的速度修正。  
 
头文件:  
ServiceCommand.h  
C++源文件:  
Service.cpp  
ServiceCommand.cpp  
ServiceEntry.cpp  
你可以在ServiceEntry.cpp中填写自己的处理,让这个服务能够真正"做一些事情"。  
 
运用的模式包括:  
Command  
Abstract  Factory  
Factory  Method  
 
本程序刻意把面向对象的思想应用到系统程序中,这是一个尝试,希望诸位多提宝贵意见,也希望大家能和我一起继续完善这个代码,共同学习提高。  
 
本程序源代码版欢迎拷贝。  
 
//  Service.cpp:  Main  funcion.  
//  
//////////////////////////////////////////////////////////////////////  
 
#include  "ServiceCommand.h"  
 
void  main(int  argc,  char  **argv)  
{  
 //  
 //  Get  command  class  
 //  
 
 CCommandFactory  Factory;  
 CServiceCommand  *pServiceCommand  =  NULL;  
 pServiceCommand  =  Factory.GetCommandClass(argc,  argv);  
 if  (NULL  ==  pServiceCommand)  
 {  
   cout  <<  "Invalid  input  arguments!"  <<  endl;  
   return;  
 }  
 
 //  
 //  Execute  the  command  
 //  
 
 if  (!pServiceCommand->ExecuteCommand())  
 {  
   cout  <<  "Execute  command  failed!"  <<  endl;  
 }  
 delete  pServiceCommand;  
}  
 
   
 
//  ServiceCommand.h:  interface  for  the  CServiceCommand  class.  
//  
//////////////////////////////////////////////////////////////////////  
 
#ifndef  __SVRFRAME_COMMAND_EADER__  
#define  __SVRFRAME_COMMAND_EADER__  
 
#include  <windows.h>  
#include  <iostream.h>  
#include  <assert.h>  
#include  <string>  
using  namespace  std;  
 
//  
//  Macro  definition  
//  
 
#define  SERVICE_FRAME_NAME                          "SvrFrame"  
#define  SERVICE_DISPALY_NAME                      "Service  frame"  
 
//  
//  Base  class  for  service  entry  
//  
 
class  CServiceCommand  
{  
public:  
 virtual  bool  ExecuteCommand()  =  0;  
};  
 
//  
//  Help  command  class.  
//  
 
class  CHelpCommand  :  public  CServiceCommand  
{  
public:  
 bool  ExecuteCommand()  
 {  
   cout  <<  "\n---------------------------  Service  Frame  2.0  ---------------------------"  <<  endl  
     <<  "CopyRight  2004.09.16.  Free  to  use  and  fix  all  bugs  by  yourself."  <<  endl  
     <<"-------------------------------------------------------------------------"  <<  endl  
     <<  "-?\t\tHelp."  <<  endl  
     <<  "-i  [/a/h/d]\tInstall  service  and  set  as  auto/hand/disable  run  setting.\n\t\tif  no  parameter  been  set,  the  service  will  be  installed\n\t\tas  auto  run."  <<  endl  
     <<  "-u\t\tUninstall  this  service."  <<  endl;  
 
   return  true;  
 }  
};  
 
//  
//  Install  command  classes  
//  
 
class  CInstallCommand  :  public  CServiceCommand  
{  
public:  
 bool  ExecuteCommand();  
 
protected:  
 virtual  DWORD  GetInstallType()  
 {  
   return  SERVICE_AUTO_START;  
 }  
};  
 
class  CAutoRunCommand  :  public  CInstallCommand  
{  
protected:  
 DWORD  GetInstallType()  
 {  
   return  SERVICE_AUTO_START;  
 }  
};  
 
class  CHandRunCommand  :  public  CInstallCommand  
{  
protected:  
 DWORD  GetInstallType()  
 {  
   return  SERVICE_DEMAND_START;  
 }  
};  
 
class  CDisableCommand  :  public  CInstallCommand  
{  
protected:  
 DWORD  GetInstallType()  
 {  
   return  SERVICE_DISABLED;  
 }  
};  
 
//  
//  Uninstall  command  class  
//  
 
class  CUninstallCommand  :  public  CServiceCommand  
{  
public:  
 bool  ExecuteCommand();  
};  
 
//  
//  Run  service  command  
//  
 
//  Service  API  
void  WINAPI  SvrCtrl(DWORD  dwCode);  
void  WINAPI  SvrStart(DWORD  dwArgc,LPTSTR  *lpArgv);  
bool  ServiceEntry();  
 
//  Service  class  
class  CRunServiceCommand  :  public  CServiceCommand  
{  
public:  
 bool  ExecuteCommand();  
 
public:  
 virtual  bool  ServiceEntry()  //  service  entry  
 {  
   return  true;  
 }  
};  
 
//  
//  Service  command  factory  
//  
 
class  CCommandFactory  
{  
public:  
 CServiceCommand  *GetCommandClass(int  nNum,  char  **szCommandLine);  //  Get  command  class  
};  
 

没有评论: