windows后台服务程序范例
来源:互联网 发布:公司大数据 编辑:程序博客网 时间:2024/06/05 03:13
//服务程序主函数。#include <stdio.h>//#include "stdafx.h"#include <Windows.h>#include <iostream>#define SZAPPNAME "serverSample" //服务程序名#define SZSERVICENAME "serviceSample" //标识服务的内部名//内部变量bool bDebugServer=false;SERVICE_STATUS ssStatus;SERVICE_STATUS_HANDLE sshStatusHandle;DWORD dwErr=0;TCHAR szErr[256];//下面的函数由程序实现void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);void WINAPI Service_Ctrl(DWORD dwCtrlCode);void installService();void removeService();void debugService(int argc,char** argv);bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);void AddToMessageLog(LPTSTR lpszMsg);void ServiceStop() ;void ServicePause() ;void ServiceContinue();int main(int argc, char* argv[]){ SERVICE_TABLE_ENTRY dispatchTable[]= { {TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main}, { NULL,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) { bDebugServer=true; debugService(argc,argv); } else { //如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用 //StartServiceCtrlDispatcher 函数。 printf("%s - install to install the service /n",SZAPPNAME); printf("%s - remove to remove the service /n",SZAPPNAME); printf("%s - debug to debug the service /n",SZAPPNAME); printf("/n StartServiceCtrlDispatcher being called./n"); printf("This may take several seconds.Please wait./n"); if(!StartServiceCtrlDispatcher(dispatchTable)) AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed.")); else AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK.")); } exit(0); } return 0;}//服务入口点函数void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具体服务的初始化入口函数void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv){ //注册服务控制处理函数 sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl); //如果注册失败 if(!sshStatusHandle) { goto cleanup; return; } //初始化 SERVICE_STATUS 结构中的成员 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; ssStatus.dwServiceSpecificExitCode=0; //更新服务状态 if(!ReportStatusToSCMgr( SERVICE_START_PENDING,//服务状态,The service is starting. NO_ERROR, //退出码 3000)) //等待时间 goto cleanup; //更新服务状态失败则转向 cleanup ServiceStart(dwArgc,lpszArgv); return;cleanup: //把服务状态更新为 SERVICE_STOPPED,并退出。 if(sshStatusHandle) (void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);}void WINAPI Service_Ctrl(DWORD dwCtrlCode){ //处理控制请求码 switch(dwCtrlCode) { //先更新服务状态为 SERVICDE_STOP_PENDING,再停止服务。 case SERVICE_CONTROL_STOP: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServiceStop(); //由具体的服务程序实现 return; //暂停服务 case SERVICE_CONTROL_PAUSE: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServicePause(); //由具体的服务程序实现 ssStatus.dwCurrentState=SERVICE_PAUSED; return; //继续服务 case SERVICE_CONTROL_CONTINUE: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServiceContinue(); //由具体的服务程序实现 ssStatus.dwCurrentState=SERVICE_RUNNING; return; //更新服务状态 case SERVICE_CONTROL_INTERROGATE: break; //无效控制码 default: break; } ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);}//安装服务程序void installService(){ SC_HANDLE schService; SC_HANDLE schSCManager; TCHAR szPath[512]; //得到程序磁盘文件的路径 //A handle to the loaded module whose path is being requested. If this parameter is NULL, //GetModuleFileName retrieves the path of the executable file of the current process. if(GetModuleFileName(NULL,szPath,512)==0) {/* _tprintf(TEXT("Unable to install %s - %s /n"), TEXT(SZAPPNAME), GetLastError());//@1获取调用函数返回的最后错误码*/ printf("Unable to install %s - %s /n" , SZAPPNAME, GetLastError()) ; return; } //打开服务管理数据库 schSCManager=OpenSCManager( NULL, //如果为NULL,则指本地计算机 NULL, //默认的数据库 SC_MANAGER_ALL_ACCESS //要求所有的访问权 ); if(schSCManager) { //登记服务程序 schService=CreateService( schSCManager, //服务管理数据库句柄 TEXT(SZSERVICENAME), //服务名 TEXT(SZAPPNAME), //用于显示服务的标识 SERVICE_ALL_ACCESS, //响应所有的访问请求 SERVICE_WIN32_OWN_PROCESS, //服务类型 SERVICE_DEMAND_START, //启动类型 SERVICE_ERROR_NORMAL, //错误控制类型 szPath, //服务程序磁盘文件的路径 NULL, //服务不属于任何组 NULL, //没有tag标识符 NULL, //启动服务所依赖的服务或服务组,这里仅仅是一个空字符串 NULL, //LocalSystem 帐号 NULL); if(schService) { /* _tprintf(TEXT("%s installed. /n"),TEXT(SZAPPNAME));*/ printf("the service created!\n") ; printf("%s installed. /n", SZAPPNAME) ; CloseServiceHandle(schService); } else { /* _tprintf(TEXT("CreateService failed - %s /n"),GetLastError());*/ printf("CreateService failed - %s /n" , GetLastError()) ; } CloseServiceHandle(schSCManager); } else printf("OpenSCManager failed - %s /n", GetLastError()) ; //_tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());}//停止和删除已安装的服务程序void removeService(){ SC_HANDLE schService; SC_HANDLE schSCManager; //打开服务管理数据库 schSCManager=OpenSCManager( NULL, //本地计算机 NULL, //默认的数据库 SC_MANAGER_ALL_ACCESS //要求所有的访问权 ); if(schSCManager) { //获取服务程序句柄 schService=OpenService( schSCManager, //服务管理数据库句柄 TEXT(SZSERVICENAME), //服务名 SERVICE_ALL_ACCESS //响应所有的访问请求 ); if(schService) { //试图停止服务 send a control code to the service ; if(ControlService( schService, //服务程序句柄(从上面打开服务获得的) SERVICE_CONTROL_STOP, //停止服务请求码 &ssStatus //接收最后的服务状态信息 )) { /* _tprintf(TEXT("Stopping %s."),TEXT(SZAPPNAME));*/ printf("Stopping %s.", SZAPPNAME) ; Sleep(1000); //等待服务停止 // while(QueryServiceStatus(schService,&ssStatus)) { if(SERVICE_STOP_PENDING==ssStatus.dwCurrentState) { // _tprintf(TEXT(".")); printf(".") ; Sleep(1000); } else break; } if(SERVICE_STOPPED==ssStatus.dwCurrentState) printf("/n %s stopped. /n", SZAPPNAME) ; // _tprintf(TEXT("/n %s stopped. /n"),TEXT(SZAPPNAME)); else printf("/n %s failed to stopp. /n", SZAPPNAME); // _tprintf(TEXT("/n %s failed to stopp. /n"),TEXT(SZAPPNAME)); } //删除已安装的服务程序安装 if(DeleteService(schService)) printf("%s removed. /n",SZAPPNAME) ; // _tprintf(TEXT("%s removed. /n"),TEXT(SZAPPNAME)); else // _tprintf(TEXT("DeleteService failed - %s. /n"), GetLastError()); printf("DeleteService failed - %s. /n", GetLastError()) ; CloseServiceHandle(schService); } else printf("OpenService failed - %s /n", GetLastError()) ; // _tprintf(TEXT("OpenService failed - %s /n"),GetLastError()); CloseServiceHandle(schSCManager); } else printf("OpenSCManager failed - %s /n" ,GetLastError()); // _tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());}void ServiceStop(){}void ServicePause(){}void ServiceContinue(){}void debugService(int argc,char** argv){ printf("debuging service ...\n") ;}void AddToMessageLog(LPTSTR lpszMsg){}//服务入口点函数void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv)//具体服务的初始化入口函数{}bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint){ return true ;}
http://www.vckbase.com/
http://www.vckbase.com/document/viewdoc/?id=1474
http://edu.gamfe.com/tutor/d/12405.html
http://blog.csdn.net/qpl007/article/details/143801
http://www.cnblogs.com/lartely/archive/2011/04/10/2011770.html
- windows后台服务程序范例
- WINDOWS后台服务程序编写
- WINDOWS后台服务程序编写
- WINDOWS后台服务程序编写
- WINDOWS后台服务程序编写
- WINDOWS后台服务程序编写
- WINDOWS后台服务程序编写
- windows后台服务程序编写
- WINDOWS后台服务程序编写
- windows 7 后台服务程序开发
- windows 7 后台服务程序开发
- windows下将已有的程序配置成后台服务运行
- windows后台服务
- 编写后台服务程序
- 后台服务程序开发
- VC 后台服务程序
- C++ 后台服务程序
- 一个简单的Windows服务应用程序范例
- spring mvc系列文章 - 拦截器篇
- J2SE基础夯实系列之String字符串拼接原理剖析
- SQL Server sa 用户密码的修改方法
- VLC发送接收RTP码流
- 我要学ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证
- windows后台服务程序范例
- awk正则匹配列中指定的字符
- java 计算PMT公式
- Oracle to_date
- POJ 1836(双向LIS)
- 【C++】拷贝构造函数与赋值操作符的本质性区别分析
- 使用CASE WHEN进行字符串替换处理
- windows下搭建cocos2dx Android开发环境
- 画椭圆 - HTML5 Canvas 作图