用VC++建立Service服务应用程序收藏为什么要使用服务应该程序呢?服务程序就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。下面就跟着我一步一步地教你怎么去创建一个服务应用程序吧。本文主要介绍了OpenSCManager、CreateService、OpenService、ControlService、DeleteService、RegisterServiceCtrlHandler、SetServiceStatus、StartServiceCtrlDispatcher等操作服务程序的主要几个API的用法,具体的函数参数大家可以查阅MSDN。一、建立Win32Application应用程序(当然你也可以建立其它的应用程序,但服务一般是没有用户界面的),并命名为ServiceTest。二、定义全局函数变量//定义全局函数变量voidInit();BOOLIsInstalled();BOOLInstall();BOOLUninstall();voidLogEvent(LPCTSTRpszFormat,...);voidWINAPIServiceMain();voidWINAPIServiceStrl(DWORDdwOpcode);TCHARszServiceName[]=_T(ServiceTest);BOOLbInstall;SERVICE_STATUS_HANDLEhServiceStatus;SERVICE_STATUSstatus;DWORDdwThreadID;三、添加Init初始化函数这里主要是设置服务句柄和状态。hServiceStatus=NULL;status.dwServiceType=SERVICE_WIN32_OWN_PROCESS;status.dwCurrentState=SERVICE_STOPPED;tatus.dwControlsAccepted=SERVICE_ACCEPT_STOP;status.dwWin32ExitCode=0;status.dwServiceSpecificExitCode=0;status.dwCheckPoint=0;status.dwWaitHint=0;四、添加安装和删除服务函数这里主要是用到了五个函数OpenSCManager、CreateService、OpenService、ControlService、DeleteService。OpenSCManager用于打开服务控制管理器;CreateService用于创建服务;OpenService用于打开已有的服务,返回该服务的句柄;ControlService则用于控制已打开的服务状态,这里是让服务停止后才删除;DeleteService用于删除指定服务。BOOLInstall();{//这里列出主要的两个函数,其它的可以在代码里找。//打开服务控制管理器OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//创建服务SC_HANDLEhService=::CreateService(hSCM,szServiceName,szServiceName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szFilePath,NULL,NULL,_T(),NULL,NULL);::CloseServiceHandle(hService);::CloseServiceHandle(hSCM);}BOOLUninstall();{//这里列出主要的两个函数,其它的可以在代码里找。//打开服务控制管理器OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务OpenService(hSCM,szServiceName,SERVICE_STOP|DELETE);//停止服务ControlService(hService,SERVICE_CONTROL_STOP,&status);//删除服务DeleteService(hService);…}五、添加服务主线程函数和控制函数这里调用RegisterServiceCtrlHandler来注册服务的控制函数,这里要设置status.dwControlsAccepted为SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。voidWINAPIServiceMain(){//Registerthecontrolrequesthandlerstatus.dwCurrentState=SERVICE_START_PENDING;status.dwControlsAccepted=SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制//注册服务控制hServiceStatus=RegisterServiceCtrlHandler(szServiceName,ServiceStrl);if(hServiceStatus==NULL){LogEvent(_T(Handlernotinstalled));return;}SetServiceStatus(hServiceStatus,&status);status.dwWin32ExitCode=S_OK;status.dwCheckPoint=0;status.dwWaitHint=0;status.dwCurrentState=SERVICE_RUNNING;SetServiceStatus(hServiceStatus,&status);//模拟服务的运行,10后自动退出。应用时将主要任务放于此即可inti=0;while(i10){Sleep(1000);i++;}//status.dwCurrentState=SERVICE_STOPPED;SetServiceStatus(hServiceStatus,&status);LogEvent(_T(Servicestopped));}六、在主线程函数里注册控制函数和程序执行主体voidWINAPIServiceMain(){…//如上,这里主要是说明这就是程序的执行体//模拟服务的运行,10后自动退出。应用时将主要任务放于此即可inti=0;while(i10){Sleep(1000);i++;}…}七、在main函数里注册添加安装、删除、注册主函数intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){Init();dwThreadID=::GetCurrentThreadId();SERVICE_TABLE_ENTRYst[]={{szServiceName,(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}};if(stricmp(lpCmdLine,/install)==0){Install();}elseif(stricmp(lpCmdLine,/uninstall)==0){Uninstall();}else{if(!::StartServiceCtrlDispatcher(st)){LogEvent(_T(RegisterServiceMainFunctionError!));}}return0;}八、总结其实做一个服务程序并不难,主要是懂得程序的执行体放于哪里?注册程序的主函数和注册控制函数,如果这两个没有注册的话,你的程序就不知道如何去控制了。status.dwControlsAccepted=SERVICE_ACCEPT_STOP;这个也重要,如果你没有设置的话,那么服务就不会受你控制了。组策略编辑器用法-如何使用组策略1、组策略编辑器的命令行启动您只需单击选择“开始”→“运行”命令,在“运行”对话框的“打开”栏中输入“gpedit.msc”,然后单击“确定”按扭即可启动WindowsXP组策略编辑器。(注:这个“组策略”程序位于“C:\WINNT\SYSTEM32”中,文件名为“gpedit.msc”。)当多人共用一台计算机时,在WindowsXP中设置用户权限,可以按照以下步骤进行:1、运行组策略编辑器程序(gpedit.msc)。2、在编辑器窗口的左侧窗格中逐级展开“计算机配置”→“Windows设置”→“安全设置”→“本地策略”→“用户权限指派”分支。3、双击需要改变的用户权限。单击“增加”,然后双击想指派给权限的用户帐号。如图8所示。连续两次单击“确定”按扭。在WindowsXP中,新增了一条命令行工具“shutdown”,其作用是“关闭或重新启动本地或远程计算机”。利用它,我们不但可以注销用户,关闭或重新启动计算机,还可以实现定时关机、远程关机。该命令的语法格式如下:shutdown[-i|-l|-s|-r|-a][-f][-m[\\ComputerName]][-txx][-cmessage][-d:xx:yy]其中,各参数的含义为:-i显示图形界面的对话框。-l注销当前用户,这是默认设置。-mComputerName优先。-s关闭计算机。-r关闭之后重新启动。-a中止关闭。除了-l和ComputerName外,系统将忽略其它参数。在超时期间,您只可以使用-a。-f强制运行要关闭的应用程序。-m[\\ComputerName]指定要关闭的计算机。-txx将用于系统关闭的定时器设置为xx秒。默认值是20秒。-cmessage指定将在“系统关闭”窗口中的“消息”区域显示的消息。最多可以使用127个字符。引号中必须包含消息。-d:xx:yy列出系统关闭的原因代码。首先,我们来看一下该命令的一些基本用法:1、注销当前用户shutdown-l该命令只能注销本机用户,对远程计算机不适用。2、关闭本地计算机shutdown-s3、重启本地计算机shutdown-r4、定时关机shutdown-s-t30指定在30秒之后自动关闭计算机。向组策略安全组添加计算机和用户无线网络策略经过配置并且能够正常工作之后,向控制该策略应用程序的安全组中添加其他计算机则非常简单。•向无线网络组策略安全组添加计算机1.在“ActiveDirectory用户和计算机”中,找到与要应用的无线网络策略相对应的WirelessNetworkPolicy-Computer安全组。您必须作为对此组具有“修改成员身份”权限的用户进行登录。2.向选定的安全组添加计算机。•向远程访问策略安全组添加用户1.登录到管理计算机,要求作为DomainAdministrators组成员登录,或者使用具有修改RemoteAccessPolicy-WirelessUsers安全组成员身份所需的安全权限的其他帐户登录。2.在“ActiveDirectory用户和计算机”中,找到与控制无线LAN访问的远程访问策略相对应的RemoteAccessPolicy-WirelessUsers安全组。3.将用户添加到选定的安全组。•将计算机添加到远程访问策略安全组1.登录到管理计算机上,要求作为DomainAdministrators组成员登录,或者使用具有修改RemoteAccessPolicy-WirelessComputers安全组成员身份所需的安全权限的其他帐户登录。2.在“ActiveDirectory用户和计算机”中,找到与控制无线LAN访问的远程访问策略相对应的RemoteAccessPolicy-WirelessUsers安全组。3.向选定的安全组中添加