首 页文章中心下载中心繁體中文
设为首页
加入收藏
联系我们
您当前的位置:开源盛世-源代码下载网 -> 文章中心 -> VC++专区 -> 文章内容 退出登录 用户管理
栏目导航
· VC++专区 · V B 专区
· GIS 专区 · PDA 专区
· 其他编程 · 网站开发类
· 数据库类 · 软件应用
· 网络安全 · 论文专区
· 综合资讯
热门文章
· Tab Control控件使用...
· 学生档案管理系统
· [图文] 排列组合公式
· UTF-8与GB2312之间的...
· DirectShow下载安装...
· Virtual PC 在PAE模...
· Windows2000终端服务...
· MapInfo上的GIS系统...
· Mapbasic参考手册索...
· MapX应用开发中文讲...
相关文章
· [图文] 基于windows mobile...
· Windows mobile 下读...
· 基于Windows的 TAPI...
· [图文] Windows CE开发之起...
· C# 2.0 匿名方法与 ...
· Visual C#中调用Win...
· Windows2000终端服务...
· Windows2000终端服务...
· 防范入侵!修改Windo...
· 经验分享:Windows网...
WindowsNT/2000/XP系统服务程序开发模版
作者:Polaris  来源:开源盛世-源代码下载网  发布时间:2005-5-31 11:14:46  发布人:Polaris

减小字体 增大字体

//以下程序为Win32控制台项目中编写。

//一、要添加的头文件

#include "winsvc.h"

//二、全局变量、全局函数定义

//服务全局变量
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
SERVICE_FAILURE_ACTIONS sfa;
CString m_sServiceName="在此输入你的服务名称";
CString m_sServiceDisplayName="在此输入你的服务显示名称";
CString m_sServiceDescription="在此输入你的服务描述";

//服务全局函数定义
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI ServiceCtrl(DWORD Opcode);
void InstallService();
void RemoveService();

// 要编写的系统服务入口函数
UINT MyServerMain(LPVOID lpvoid);

//三、_tmain函数

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;

 // 初始化 MFC 并在失败时显示错误
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: 更改错误代码以符合您的需要
  _tprintf(_T("致命错误: MFC 初始化失败\n"));
  nRetCode = 1;
 }
 else
 {
  // TODO: 在此处为应用程序的行为编写代码。
  SERVICE_TABLE_ENTRY ste[2];
  ste[0].lpServiceName=m_sServiceName;
  ste[0].lpServiceProc=ServiceMain;
  ste[1].lpServiceName=NULL;
  ste[1].lpServiceProc=NULL;
  if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
  {
   if(_stricmp("install",argv[1]+1)==0)
   {
    InstallService();
   }
   else if(_stricmp("remove",argv[1]+1)==0)
   {
    RemoveService();
   }
   else if(_stricmp("debug",argv[1]+1)==0)
   {
    MyServerMain(NULL);
   }
   else
   {
    //如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
    //StartServiceCtrlDispatcher 函数。
    printf(" -install to install the service \n");
    printf(" -remove to remove the service \n");
    printf(" -debug to debug the service \n");
    printf("\n StartServiceCtrlDispatcher being called.\n");
    printf("This may take several seconds.Please wait.\n");
    if(!StartServiceCtrlDispatcher(ste))
     printf(TEXT("StartServiceCtrlDispatcher failed."));
    else
     printf(TEXT("StartServiceCtrlDispatcher OK."));
   }
  }
  else
  {
   ////如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
   ////StartServiceCtrlDispatcher 函数。
   printf(" -install to install the service \n");
   printf(" -remove to remove the service \n");
   printf(" -debug to debug the service \n");
   printf("\n StartServiceCtrlDispatcher being called.\n");
   printf("This may take several seconds.Please wait.\n");
   if(!StartServiceCtrlDispatcher(ste))
    printf(TEXT("StartServiceCtrlDispatcher failed."));
   else
    printf(TEXT("StartServiceCtrlDispatcher OK."));

   //测试
   //MyServerMain(NULL);
  }
 }

 return nRetCode;
}

//四、系统服务函数

void InstallService()
{
 LPTSTR lpSysPath=new char[MAX_PATH];
 GetSystemDirectory(lpSysPath,MAX_PATH);
 LPCTSTR lpsysfilename;
 SERVICE_DESCRIPTION SvrDes;
 SvrDes.lpDescription=m_sServiceDescription.GetBuffer();

 CString RunPath;
 ::GetModuleFileName(::AfxGetInstanceHandle(), RunPath.GetBuffer(1024), 1024);
 lpsysfilename=RunPath;
 scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
 if(scm!=NULL)
 {
  svc=CreateService(scm,m_sServiceName,m_sServiceDisplayName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
  Sleep(1000);
  ChangeServiceConfig2(svc,SERVICE_CONFIG_DESCRIPTION,&SvrDes);
  SC_ACTION ssa[1];
  ssa[0].Delay=5000;    //服务失败5000毫秒后执行失败操作
  ssa[0].Type=SC_ACTION_RESTART; //失败后重新启动服务
  sfa.dwResetPeriod=0;   //0秒后重置失败计数
  sfa.lpCommand=NULL;
  sfa.lpRebootMsg=NULL;
  sfa.cActions=1;
  sfa.lpsaActions=ssa;
  ChangeServiceConfig2(svc,SERVICE_CONFIG_FAILURE_ACTIONS,&sfa);
  Sleep(1000);
 }
 if(svc!=NULL)
 {
  svc=OpenService(scm,m_sServiceName,SERVICE_START);
 }
 if(svc!=NULL)
 {
  StartService(svc,0,NULL);
  CloseServiceHandle(svc);
 }
 CloseServiceHandle(scm);
 delete lpSysPath;
}

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
 ss.dwServiceType=SERVICE_WIN32;
 ss.dwCurrentState=SERVICE_START_PENDING;
 ss.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
 ss.dwServiceSpecificExitCode=0;
 ss.dwWin32ExitCode=0;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 ssh=RegisterServiceCtrlHandler(m_sServiceName,ServiceCtrl);
 ss.dwCurrentState=SERVICE_RUNNING;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 SetServiceStatus(ssh,&ss);
 AfxBeginThread(MyServerMain,NULL,NULL);
 ss.dwCurrentState=SERVICE_RUNNING;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 SetServiceStatus(ssh,&ss);
}

void WINAPI ServiceCtrl(DWORD Opcode)
{
 switch(Opcode)
 {
 case SERVICE_CONTROL_STOP:
  ss.dwCurrentState=SERVICE_STOPPED;
  SetServiceStatus(ssh,&ss);
  break;
 case SERVICE_CONTROL_CONTINUE:
  ss.dwCurrentState=SERVICE_RUNNING;
  SetServiceStatus(ssh,&ss);
  break;
 case SERVICE_CONTROL_PAUSE:
  ss.dwCurrentState=SERVICE_PAUSED;
  SetServiceStatus(ssh,&ss);
  break;
 case SERVICE_CONTROL_INTERROGATE:
  break;
 }
 SetServiceStatus(ssh,&ss);
}

void RemoveService()
{
 SC_HANDLE schService;
 SC_HANDLE schSCManager;
 SERVICE_STATUS ssStatus;
 //打开服务管理数据库
 schSCManager=OpenSCManager(
  NULL,    //本地计算机
  NULL,    //默认的数据库
  SC_MANAGER_ALL_ACCESS  //要求所有的访问权
  );
 if(schSCManager)
 {
  //获取服务程序句柄
  schService=OpenService(
   schSCManager,   //服务管理数据库句柄
   m_sServiceName,  //服务名
   SERVICE_ALL_ACCESS //响应所有的访问请求
   );
  if(schService)
  {
   //试图停止服务
   if(ControlService(
    schService,    //服务程序句柄
    SERVICE_CONTROL_STOP, //停止服务请求码
    &ssStatus    //接收最后的服务状态信息
    ))
   {
    _tprintf(TEXT("Stopping %s."),m_sServiceName);
    Sleep(1000);
    //等待服务停止
    //
    while(QueryServiceStatus(schService,&ssStatus))
    {
     if(SERVICE_STOP_PENDING==ssStatus.dwCurrentState)
     {
      _tprintf(TEXT("."));
      Sleep(1000);
     }
     else
      break;
    }
    if(SERVICE_STOPPED==ssStatus.dwCurrentState)
     _tprintf(TEXT("\n%s stopped. \n"),m_sServiceName);
    else
     _tprintf(TEXT("\n%s failed to stopp. \n"),m_sServiceName);
   }
   //删除已安装的服务程序安装
   if(DeleteService(schService))
    _tprintf(TEXT("%s removed. \n"),m_sServiceName);
   else
    _tprintf(TEXT("DeleteService failed - %s. \n"), GetLastError());
   CloseServiceHandle(schService);
  }
  else
   _tprintf(TEXT("OpenService failed - %s \n"),GetLastError());
  CloseServiceHandle(schSCManager);
 }
 else
  _tprintf(TEXT("OpenSCManager failed - %s \n"),GetLastError());
}

//五、你自己的功能函数入口

UINT MyServerMain(LPVOID lpvoid)
{
 return 0;
}

End of《WindowsNT/2000/XP系统服务程序开发模版》

[] [返回上一页] [打 印] [收 藏]
 
∷相关“WindowsNT/2000/XP系统服务程序开发模版”文章评论∷
(评论内容只代表网友观点,与本站立场无关!) [更多评论...]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 网站目录 鄂ICP备06007162
开源盛世 版权所有Copyright © 2003-2005 VSCodes.Com. All Rights Reserved.