




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*一个服务程序的例子本例子要含有安装服务,卸载服务,停止服务,起动服务,显示服务信息,和一个多线程小服务程序(本例子的在控制面板的服务中显示为test,服务名称为testserverDWORD WINAPI sc(LPVOID lp); /线程int mains(); /服务程序主函数一个服务程序的大概过程是1 服务程序主函数(main)-调用系统函数StartServiceCtrlDispatcher连接 程序主线程到服务控制管理程序(其中定义了服务入口点函数是ServiceMain)2 服务入口点函数(ServiceMain)-执行服务初始化任务(同时执行多个服务的 服务有多个入口点函数),首先调用RegisterServiceCtrlHandler定义控制处理程序 函数(本例中是servier_ctrl),初始化后通过SetServiceStatus设定进行运行状态, 然后运行服务代码3 控制处理程序(Handler)-在服务收到控制请求时由控制分发线程引用(最少要有停止 服务的能力) */#include stdafx.h#include #include #include #include /#include #include #pragma comment(lib,ws2_32.lib)VOID CmdInstallService(); /安装函数VOID 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,&wsa);cwinsock2(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/Mycode();/这儿可放入用户自己的相关代码closesocket(mys); /关闭mys 使mains中的accept出错Sleep(2000); ss.dwWin32ExitCode = 0; ss.dwCurrentState =SERVICE_STOPPED; /把Service的当前状态置为STOP ss.dwCheckPoint = 0; ss.dwWaitHint = 0;SetServiceStatus (ssh,&ss); /必须随时更新数据库中Service的状态 break; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus (ssh,&ss); /必须随时更新数据库中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=SERVICE_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, &ss);/必须随时更新数据库中Service的状态。 /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,&ss); mains(); /while (s_end=0) /Sleep(1000); /Mycode();/ 这儿也可放入用户自己的代码int main(int argc, char *argv) if ( (argc1) & (*argv1=-)|(*argv1=/) /分析参数 if (_stricmp( install, argv1+1 ) = 0 ) CmdInstallService(); 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 & argc=4) sname=argv2; if (_stricmp(stop,argv3)=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,argv0 ); 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( 这里的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=ServiceMain; /线程入口地址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,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 database sname, / 服务名称 sview, / 显示的名称 SERVICE_ALL_ACCESS, / desired access SERVICE_WIN32_OWN_PROCESS, / service typeSERVICE_AUTO_START, /以自动方式开始start type SERVICE_ERROR_NORMAL, / error control type指定启动失败的严重程度 szPath, / Service本体程序路径,必须与具体位置相符 NULL, / 指定顺序装入的服务组名 NULL, / 填NULL NULL, / 启动本服务必须先启动的服务 NULL, / 指定服务账号如: Dominausername .username 如果为NULL,说明用LocalSystem NULL); / 账号密码,如果是LocalSystem 为NULL if ( schService ) printf(%s installed.n,sname ); CloseServiceHandle(schService); else printf(CreateService failed - %sn,sname); CloseServiceHandle(schSCManager); else printf(OpenSCManager failed - %sn); VOID CmdRemoveService() /卸载函数 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) / 先关闭服务 if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) ) printf(Stopping %s., sview); Sleep( 1000 ); while( QueryServiceStatus( schService, &ssStatus ) ) if ( ssStatus.dwCurrentState = SERVICE_STOP_PENDING ) printf(.); 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,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; schSCManager = 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,SERVICE_WIN32,SERVICE_STATE_ALL,&win32list0,0,&rsize,&s1,&s2);bsize=rsize+1;EnumServicesStatus(schSCManager,SERVICE_WIN32,SERVICE_STATE_ALL,&win32list0,bsize,&rsize,&s1,&s2);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_DRIVER,SERVICE_STATE_ALL,&driverlist0,0,&rsize,&s1,&s2);bsize=rsize+1;EnumServicesStatus(schSCManager,SERVICE_DRIVER,SERVICE_STATE_ALL,&driverlist0,bsize,&rsize,&s1,&s2);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(schSCManager,sname,SERVICE_ALL_ACCESS); if (schService) printf(OpenService %s n,sname); if (QueryServiceStatus( schService, &ssStatus ) if (ssStatus.dwCurrentState = SERVICE_STOPPED) printf(SERVICE_STOPPEDn);if (ssStatus.dwCurrentState = SERVICE_RUNNING) printf(SERVICE_RUNNINGn);if (ssStatus.dwCurrentState = SERVICE_START_PENDING) printf(SERVICE_START_PENDINGn);if (ssStatus.dwCurrentState = 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_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(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,&my,0,&s2);/s3=s2+250;QueryServiceConfig(schService,&my,500,&s1);printf(Server dsiplay name=%sn,my.lpDisplayName);printf(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) / 关闭服务 if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) ) printf(Stopping %s., sname); Sleep( 1000 ); while( QueryServiceStatus( schService, &ssStatus ) ) if ( ssStatus.dwCurrentState = SERVICE_STOP_PENDING ) printf(.); Sleep( 1000 ); else break; if ( ssStatus.dwCurrentState = SERVICE_STOPPED ) printf(n%s stopped.n,sname); else printf(n%s failed to stop.n,sname); CloseServiceHandle(schService); else printf(OpenService failed - %sn); CloseServiceHandle(schSCManager); else printf(OpenSCManager failed n);VOID CmdStartService() /起动一个服务 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) / 起动服务 if ( StartService(schService,NULL,NULL) printf(Starting %s., sname); Sleep( 1000 ); while( QueryServiceStatus( schService, &ssStatus ) ) if ( ssStatus.dwCurrentState = SERVICE_START_PENDING ) printf(.); Sleep( 500 ); else break; if ( ssStatus.dwCurrentState = SERVICE_RUNNING ) printf(n%s running.n,sname); else printf(n%s failed to run.n,sname); elseQueryServiceStatus( schService, &ssStatus ); if ( ssStatus.dwCurrentState = SERVICE_RUNNING ) printf(n%s running.n,sname); else printf(n%s f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光伏折扣合同样本
- 劳务合同标准文本超市
- 公租房购房合同样本
- 加工承揽合同样本w
- 兼职家政人员合同样本
- 制作挡车杆合同样本
- 农贸市场供电合同标准文本
- 分组门面合同样本
- 加盟项目合同标准文本
- 分销分佣合同标准文本
- 11.1 化学与人体健康(课件)-2024-2025学年九年级化学人教版下册
- 2025年水质化验工题库 - 副本
- 2025年吉林司法警官职业学院单招职业倾向性考试题库必考题
- 光伏发电项目施工的应急预案与措施
- 污水处理厂工程设备安装施工方案及技术措施
- 毕业设计(论文)-护栏清洗机设计
- 2025年春人教版英语七年级下册 Unit 7 A Day to Remember(教学设计)
- 2025年电力人工智能多模态大模型创新技术及应用报告-西安交通大学
- 2025-2030年中国光学加工机械市场运行态势及发展趋势分析报告
- 《项目经理竞聘汇报》课件
- 2025年沪教版八年级物理下册阶段测试试卷
评论
0/150
提交评论