Windows服务程序结构
来源:互联网 发布:unity3d awake start 编辑:程序博客网 时间:2024/06/07 23:56
#include "Server.h"//---------------------------------------------------------------------------------int main( int argc, char **argv ){ Svr_Init(); DWORD dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)Svr_ServiceMain }, { NULL, NULL } }; LPSTR lpCmdLine = argv[1]; if ( argc == 2 ) { BOOL bRet; if (strcmp(lpCmdLine, "/install") == 0) { bRet = Svr_Install(); if ( bRet == TRUE ) { printf( "Install service %s success", SERVICE_NAME ); }else { printf( "Install service %s failed", SERVICE_NAME ); } } else if (strcmp(lpCmdLine, "/uninstall") == 0) { bRet = Svr_Uninstall(); if ( bRet == TRUE ) { printf( "Uninstall service %s success", SERVICE_NAME ); }else { printf( "Uninstall service %s failed", SERVICE_NAME ); } }else if (strcmp(lpCmdLine, "/start") == 0) { bRet = Svr_Start(); if ( bRet == TRUE ) { printf( "Start service %s success", SERVICE_NAME ); }else { printf( "Start service %s failed", SERVICE_NAME ); } }else if (strcmp(lpCmdLine, "/stop") == 0) { bRet = Svr_Stop(); if ( bRet == TRUE ) { printf( "Stop service %s success", SERVICE_NAME ); }else { printf( "Stop service %s failed", SERVICE_NAME ); } } else { if (!::StartServiceCtrlDispatcher(st)) { //Register Service Main Function Error! ; } } }else { if (!::StartServiceCtrlDispatcher(st)) { //Register Service Main Function Error! ; } } return 0;}
#include "Server.h"HANDLE hEvent = INVALID_HANDLE_VALUE;SERVICE_STATUSstatus;SERVICE_STATUS_HANDLEhServiceStatus;//---------------------------------------------------------------------------------//---------------------------------------------------------------------------------void Svr_Init(){ hServiceStatus = NULL; status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; status.dwCurrentState = SERVICE_STOPPED; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; status.dwWin32ExitCode = 0; status.dwServiceSpecificExitCode = 0; status.dwCheckPoint = 0; status.dwWaitHint = 0;}int Svr_IsInstalled(){ BOOL bResult = FALSE; //打开服务控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM != NULL) { //打开服务 SC_HANDLE hService = ::OpenService(hSCM, SERVICE_NAME, SERVICE_QUERY_CONFIG); if (hService != NULL) { bResult = TRUE; ::CloseServiceHandle(hService); } ::CloseServiceHandle(hSCM); } return bResult;}int Svr_Install( ){ if( Svr_IsInstalled() ) return TRUE; //打开服务控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { return FALSE; } // Get the executable file path TCHAR szFilePath[MAX_PATH]; ::GetModuleFileName(NULL, szFilePath, MAX_PATH); //创建服务 SC_HANDLE hService = ::CreateService( hSCM, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动 SERVICE_ERROR_NORMAL, szFilePath, NULL, NULL, TEXT(""), NULL, NULL); if (hService == NULL) { ::CloseServiceHandle(hSCM); return FALSE; } ::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); return TRUE;}int Svr_Uninstall( ){ if (!Svr_IsInstalled()) return TRUE; SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { return FALSE; } SC_HANDLE hService = ::OpenService(hSCM, SERVICE_NAME, SERVICE_STOP | DELETE); if (hService == NULL) { ::CloseServiceHandle(hSCM); return FALSE; } SERVICE_STATUS status; ::ControlService(hService, SERVICE_CONTROL_STOP, &status); //删除服务 BOOL bDelete = ::DeleteService(hService); ::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); if (bDelete) return TRUE; //Service could not be deleted return FALSE;}int Svr_Start( ){ BOOL bRet; SC_HANDLE hSCM; SC_HANDLE hService; hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT); if (hSCM!=NULL) { hService=OpenService( hSCM, SERVICE_NAME, SERVICE_START); if (hService!=NULL) { //开始Service bRet = StartService(hService,0,NULL); CloseServiceHandle(hService); }else { bRet = FALSE; } CloseServiceHandle(hSCM); }else { bRet = FALSE; } return bRet;}int Svr_Stop( ){ BOOL bRet; SC_HANDLE hSCM; SC_HANDLE hService; SERVICE_STATUS ServiceStatus; hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (hSCM!=NULL) { hService=OpenService( hSCM, SERVICE_NAME, SERVICE_STOP|SERVICE_QUERY_STATUS ); if (hService!=NULL) { QueryServiceStatus( hService, &ServiceStatus ); if (ServiceStatus.dwCurrentState == SERVICE_RUNNING) { bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus ); }else { bRet = FALSE; } CloseServiceHandle( hService ); }else { bRet = FALSE; } CloseServiceHandle( hSCM ); }else { bRet = FALSE; } return bRet;}void WINAPI Svr_ServiceMain( ){ // Register the control request handler status.dwCurrentState = SERVICE_START_PENDING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; //注册服务控制 hServiceStatus = RegisterServiceCtrlHandler( SERVICE_NAME, Svr_ServiceStrl); if (hServiceStatus == NULL) { //Handler not installed return; } SetServiceStatus(hServiceStatus, &status); //如下代码可以为启动服务前的准备工作 hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL ); if ( hEvent == NULL ) { //Failure to start service status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); return; } // //更改服务状态为启动 status.dwWin32ExitCode = S_OK; status.dwCheckPoint = 0; status.dwWaitHint = 0; status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hServiceStatus, &status); char log[256] = {0}; //等待用户选择停止服务 while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 ) { //Service runing... //模拟服务的运行,应用时将主要任务放于此即可 //printf("test!"); gettime(log); writelog(log); memset(log, 0, 256); //Sleep(1000); } //Service stopped status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status);}void WINAPI Svr_ServiceStrl( DWORD dwOpcode ){ switch (dwOpcode) { case SERVICE_CONTROL_STOP: status.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(hServiceStatus, &status); //告诉服务线程停止工作 ::SetEvent( hEvent ); break; case SERVICE_CONTROL_PAUSE: break; case SERVICE_CONTROL_CONTINUE: break; case SERVICE_CONTROL_INTERROGATE: break; case SERVICE_CONTROL_SHUTDOWN: break; default: //Bad service request break; }}void writelog(char *log){ FILE *fp; fp = fopen("D:\\log.txt", "a"); if (fp != NULL) { fprintf(fp, "%s\n", log); } if (fp) { fclose(fp); }}void gettime(char *time){ SYSTEMTIME s_time; GetLocalTime(&s_time); sprintf(time, "%04d/%02d/%02d %02d:%02d:%02d", s_time.wYear, s_time.wMonth, s_time.wDay, s_time.wHour, s_time.wMinute, s_time.wSecond);}
#ifndef SERVER_H_#define SERVER_H_#include "stdio.h" #include <windows.h> //----------------------------------------------------------------------------#define SERVICE_NAMETEXT("TEST Licence Server")#ifdef __cplusplusextern "C"{#endif //---------------------------------------------------------------------------- voidSvr_Init(); intSvr_IsInstalled(); intSvr_Install( ); intSvr_Uninstall( ); intSvr_Start( ); intSvr_Stop( ); void WINAPI Svr_ServiceMain( ); void WINAPI Svr_ServiceStrl( DWORD dwOpcode ); //---------------------------------------------------------------------------- //#ifdef __cplusplus}void writelog(char *log);void gettime(char *time);#endif//----------------------------------------------------------------------------#endif
服务程序的安装卸载可以通过命令行输入参数执行具体函数来进行,或者使用系统自带命令SC来进行
安装脚本:
sc create "TEST Licence Server" binpath= "E:\TestCode\TestServer\Debug\TestServer.exe" DisplayName= "TEST Licence Server" depend= Tcpip start= autosc description "TEST Licence Server" "测试代码"pause
卸载脚本:
sc stop "Test Licence Server"sc delete "Test Licence Server"pause
0 0
- Windows服务程序结构
- Windows 程序结构
- 简单的Windows API程序结构
- windows——程序结构概述
- 程序结构
- 程序结构
- Windows服务
- Windows 服务
- windows服务
- Windows服务
- windows服务
- Windows服务
- windows服务
- windows服务
- Windows服务
- Windows 服务
- Windows服务
- Windows服务
- 初学算法——斐波那契数列
- 20170122 三十几岁了开始学习编程 晚不晚啊?
- javaWEB 开发目录
- 上传文件与应用服务器Tomcat分离,并有效的进行跨域回显
- HTTP协议分析系列(三)------HTTP协议方法和状态码
- Windows服务程序结构
- PAT TEST 甲级1009. Product of Polynomials (25)
- 形势展望:2017必须关注的中国即将发生的47个重大变化
- 杭电oj 1003 java
- oracle查询被锁的表,解锁方法
- 【centos7】修改mac的一个小坑(SIOCSIFHWADDR cannot assign requested addresss)
- 写一个iOS复杂表单的正确姿势
- qt sse指令加速配置
- 根据指定要求分割字符串