一个服务程序的例子.doc

上传人:sk****8 文档编号:3150722 上传时间:2019-05-23 格式:DOC 页数:14 大小:74KB
下载 相关 举报
一个服务程序的例子.doc_第1页
第1页 / 共14页
一个服务程序的例子.doc_第2页
第2页 / 共14页
一个服务程序的例子.doc_第3页
第3页 / 共14页
一个服务程序的例子.doc_第4页
第4页 / 共14页
一个服务程序的例子.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、/*一个服务程序的例子本例子要含有安装服务,卸载服务,停止服务,起动服务,显示服务信息,和一个多线程小服务程序(本例子的在控制面板的服务中显示为 test,服务名称为 testserverDWORD WINAPI sc(LPVOID lp); /线程int mains(); /服务程序主函数一个服务程序的大概过程是1 服务程序主函数(main)-调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制管理程序(其中定义了服务入口点函数是ServiceMain)2 服务入口点函数(ServiceMain)-执行服务初始化任务(同时执行多个服务的服务有多个入口点

2、函数),首先调用 RegisterServiceCtrlHandler 定义控制处理程序函数(本例中是 servier_ctrl),初始化后通过 SetServiceStatus 设定进行运行状态,然后运行服务代码3 控制处理程序(Handler)-在服务收到控制请求时由控制分发线程引用(最少要有停止服务的能力)*/#include “stdafx.h“#include #include #include #include /#include #include #pragma comment(lib,“ws2_32.lib“)VOID CmdInstallService(); /安装函数VOI

3、D CmdRemoveService(); /卸载函数VOID CmdInfoService(); /显示一个服务的信息函数VOID CmdStopService(); /停止一个服务VOID CmdStartService(); /起动一个服务DWORD WINAPI sc(LPVOID lp); /线程int mains(); /服务程序主函数class sockbad;class cwinsock2 /一个 winsock2 的初始化类public:cwinsock2(void)WORD wv;WSADATA wsa;wv=MAKEWORD(2,0);WSAStartup(wv,cwin

4、sock2(void)WSACleanup();SERVICE_STATUS_HANDLE ssh;SERVICE_STATUS ss; /服务选行状态char *sname=“testserver“; /服务名称char *sview=“test“; /服务显示时的名称SOCKET mys; /服务用的 socket 字/QUERY_SERVICE_CONFIG mycon; /服务信息void WINAPI servier_ctrl(DWORD Opcode) /服务控制程序switch(Opcode)case SERVICE_CONTROL_STOP: /停止 Service/Mycod

5、e();/这儿可放入用户自己的相关代码closesocket(mys); /关闭 mys 使 mains 中的 accept 出错Sleep(2000);ss.dwWin32ExitCode = 0;ss.dwCurrentState =SERVICE_STOPPED; /把 Service 的当前状态置为 STOPss.dwCheckPoint = 0;ss.dwWaitHint = 0;SetServiceStatus (ssh,/必须随时更新数据库中 Service 的状态break;case SERVICE_CONTROL_INTERROGATE:SetServiceStatus (s

6、sh,/必须随时更新数据库中 Service 的状态break;void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)/ssh=RegisterServiceCtrlHandler(“W.Z.SERVICE“,Handler);ssh=RegisterServiceCtrlHandler(sname,servier_ctrl);cwinsock2 winsock2start;/ssh=RegisterServiceCtrlHandler(sname,Handler);/ 服务程序名和控制程序入口地址ss.dwServiceType=SERV

7、ICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;ss.dwCurrentState=SERVICE_START_PENDING;/START_PENDING,待用户程序完成后再设为 SERVICE_RUNNING。ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;/表明 Service 目前能接受的命令是停止命令。ss.dwWin32ExitCode=NO_ERROR;ss.dwCheckPoint=0;ss.dwWaitHint=0;SetServiceStatus(ssh, /必须随时更新数据库中 Ser

8、vice 的状态。/Mycode(); /这儿可放入用户自己的代码ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;ss.dwCurrentState=SERVICE_RUNNING;ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;ss.dwWin32ExitCode=NO_ERROR;ss.dwCheckPoint=0;ss.dwWaitHint=0;SetServiceStatus(ssh,mains(); /while (s_end=0)/Sleep(1000)

9、;/Mycode();/ 这儿也可放入用户自己的代码int main(int argc, char *argv)if ( (argc1) else if ( _stricmp( “remove“, argv1+1 ) = 0 )CmdRemoveService();else if ( _stricmp( “info“, argv1+1 ) = 0 ) if (argc2) sname=argv2;CmdInfoService();printf(“info endn“); else if (_stricmp(“contrl“,argv1+1)=0 if (_stricmp(“stop“,argv

10、3)=0) CmdStopService();if (_stricmp(“start“,argv3)=0) CmdStartService();else/没有参数正确printf( “%s -install to install the servicen“, argv0 );printf( “%s -remove to remove the servicen“, argv0 );printf( “%s -info to view server infon“,argv0 );printf( “%s -contrl server name stop|start contrl servern“,ar

11、gv0 );printf(“ 这里的 server name 注册表中的名称 n“);return 0;/没有参数打印参数表并起动服务printf( “%s -install to install the servicen“, argv0 );printf( “%s -remove to remove the servicen“, argv0 );printf( “%s -info to view server infon“,argv0 );printf( “%s -contrl server name stop|start contrl servern“,argv0 );printf(“ 这

12、里的 server name 注册表中的名称 n“);printf( “nStartServiceCtrlDispatcher being called.n“ );printf( “This may take several seconds. Please wait.n“ );/起动服务SERVICE_TABLE_ENTRY ste2; /一个 Service 进程可以有多个线程,这是每个线程的入口表ste0.lpServiceName=sname; /线程名字,实际上如果是SERVICE_WIN32_OWN_PROCESS 这个会忽略的ste0.lpServiceProc=ServiceMa

13、in; /线程入口地址ste1.lpServiceName=NULL; /最后一个必须为 NULLste1.lpServiceProc=NULL; StartServiceCtrlDispatcher(ste); return 0;VOID CmdInstallService() /安装函数 SC_HANDLE schService;SC_HANDLE schSCManager;TCHAR szPath512;/得到程序磁盘文件的路径if ( GetModuleFileName( NULL, szPath, 512 ) = 0 )printf(“Unable to install %s-%sn

14、“,sview,sname);return;/打开服务管理数据库schSCManager = OpenSCManager(NULL, / machine (NULL = local)NULL, / database (NULL = default)SC_MANAGER_ALL_ACCESS / access required);if ( schSCManager ) /安装schService = CreateService(schSCManager, / SCManager databasesname, / 服务名称sview, / 显示的名称SERVICE_ALL_ACCESS, / de

15、sired accessSERVICE_WIN32_OWN_PROCESS, / service typeSERVICE_AUTO_START, /以自动方式开始start typeSERVICE_ERROR_NORMAL, / error control type 指定启动失败的严重程度 szPath, / Service 本体程序路径,必须与具体位置相符NULL, / 指定顺序装入的服务组名NULL, / 填 NULLNULL, / 启动本服务必须先启动的服务NULL, / 指定服务账号如: Dominausername .username 如果为 NULL,说明用 LocalSystem

16、NULL); / 账号密码,如果是LocalSystem 为 NULLif ( schService )printf(“%s installed.n“,sname );CloseServiceHandle(schService);elseprintf(“CreateService failed - %sn“,sname);CloseServiceHandle(schSCManager);else printf(“OpenSCManager failed - %sn“);VOID CmdRemoveService() /卸载函数SC_HANDLE schService; SC_HANDLE sc

17、hSCManager; SERVICE_STATUS ssStatus;schSCManager = OpenSCManager( NULL, / machine (NULL = local) NULL, / database (NULL = default) SC_MANAGER_ALL_ACCESS / access required ); if ( schSCManager ) schService = OpenService(schSCManager,sname,SERVICE_ALL_ACCESS); if (schService) / 先关闭服务if ( ControlServic

18、e( schService, SERVICE_CONTROL_STOP, Sleep( 1000 ); while( QueryServiceStatus( schService, Sleep( 1000 ); else break; if ( ssStatus.dwCurrentState = SERVICE_STOPPED ) printf(“n%s stopped.n“,sview); else printf(“n%s failed to stop.n“,sview); / 现在删除服务if( DeleteService(schService) ) printf(“%s removedn

19、“,sview); else printf(“DeleteService failed n“); CloseServiceHandle(schService); else printf(“OpenService failed - %sn“);CloseServiceHandle(schSCManager); else printf(“OpenSCManager failed n“); VOID CmdInfoService() /显示当前服务的信息函数SC_HANDLE schService; SC_HANDLE schSCManager; SERVICE_STATUS ssStatus;sc

20、hSCManager = OpenSCManager( NULL, / machine (NULL = local) NULL, / database (NULL = default) SC_MANAGER_ALL_ACCESS / access required ); if ( schSCManager ) if (stricmp( “all“,sname)= 0)ENUM_SERVICE_STATUS win32list200,driverlist200;DWORD bsize=0,rsize=0,s1=0,s2=0,n=0;EnumServicesStatus(schSCManager,

21、SERVICE_WIN32,SERVICE_STATE_ALL,bsize=rsize+1;EnumServicesStatus(schSCManager,SERVICE_WIN32,SERVICE_STATE_ALL,for(n=0;ns1;n+) printf(“SERVICE_WIN32(%d) name=%s view name=%s n“,n+1,win32listn.lpServiceName,win32listn.lpDisplayName);bsize=0,rsize=0,s1=0,s2=0;EnumServicesStatus(schSCManager,SERVICE_DRI

22、VER,SERVICE_STATE_ALL,bsize=rsize+1;EnumServicesStatus(schSCManager,SERVICE_DRIVER,SERVICE_STATE_ALL,for(n=0;ns1;n+) printf(“SERVICE_DRIVER(%d) name=%s view name=%s n“,n+1,driverlistn.lpServiceName,driverlistn.lpDisplayName);CloseServiceHandle(schSCManager); return ;schService = OpenService(schSCMan

23、ager,sname,SERVICE_ALL_ACCESS); if (schService) printf(“OpenService %s n“,sname);if (QueryServiceStatus( schService, if (ssStatus.dwCurrentState = SERVICE_RUNNING) printf(“SERVICE_RUNNINGn“);if (ssStatus.dwCurrentState = SERVICE_START_PENDING) printf(“SERVICE_START_PENDINGn“);if (ssStatus.dwCurrentS

24、tate = SERVICE_STOP_PENDING) printf(“SERVICE_STOP_PENDINGn“);if (ssStatus.dwCurrentState = SERVICE_CONTINUE_PENDING) printf(“SERVICE_CONTINUE_PENDINGn“);if (ssStatus.dwCurrentState = SERVICE_PAUSE_PENDING) printf(“SERVICE_PAUSE_PENDINGn“);if (ssStatus.dwCurrentState = SERVICE_PAUSED) printf(“SERVICE

25、_PAUSEDn“);switch (ssStatus.dwServiceType )case SERVICE_WIN32_OWN_PROCESS:printf(“SERVICE_WIN32_OWN_PROCESSn“);break;case SERVICE_WIN32_SHARE_PROCESS:printf(“SERVICE_WIN32_SHARE_PROCESSn“);break;case SERVICE_KERNEL_DRIVER:printf(“SERVICE_KERNEL_DRIVERn“);break;case SERVICE_FILE_SYSTEM_DRIVER:printf(

26、“SERVICE_FILE_SYSTEM_DRIVERn“);break;case SERVICE_INTERACTIVE_PROCESS :printf(“SERVICE_INTERACTIVE_PROCESS n“);break;default:break;DWORD s1;QUERY_SERVICE_CONFIG myy,my; /服务信息/QueryServiceConfig(schService,/ s3=s2+250;QueryServiceConfig(schService,printf(“Server dsiplay name=%sn“,my.lpDisplayName);pr

27、intf(“File path=%sn“,my.lpBinaryPathName );else printf(“q non“);CloseServiceHandle(schService); else printf(“cant OpenService %s n“,sname);CloseServiceHandle(schSCManager); else printf(“OpenSCManager failed n“);return;VOID CmdStopService() /停止一个服务SC_HANDLE schService; SC_HANDLE schSCManager; SERVICE_STATUS ssStatus;schSCManager = OpenSCManager( NULL, / machine (NULL = local) NULL, / database (NULL = default) SC_MANAGER_ALL_ACCESS / access required ); if ( schSCManager ) schService = OpenService(schSCManager,sname,SERVICE_ALL_ACCESS); if (schService)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 建筑建材

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。