关于windows服务启动的有关问题,请问
关于windows服务启动的问题,请教
- C/C++ code
void Help() { printf("\t-install 安装windows服务\n"); printf("\t-uninstall 删除windows服务\n"); printf("\t-start 启动windows服务\n"); printf("\t-stop 停止windows服务\n"); } int main( int argc, char* argv[] ) { Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; LPSTR lpCmdLine = argv[1]; if ( argc == 2 ) { BOOL bRet; if (stricmp(lpCmdLine, "-install") == 0) { bRet = InstallService(); if ( bRet == TRUE ) { Log( "Install service %s success", szServiceName ); }else { Log( "Install service %s failed", szServiceName ); } } else if (stricmp(lpCmdLine, "-uninstall") == 0) { bRet = UninstallService(); if ( bRet == TRUE ) { Log( "Uninstall service %s success", szServiceName); }else { Log( "Uninstall service %s failed[%d]", szServiceName,GetLastError()); } }else if (stricmp(lpCmdLine, "-start") == 0) { bRet = ServiceCtrlStart(); if ( bRet == TRUE ) { Log( "Start service %s success", szServiceName ); }else { Log( "Start service %s failed[%d]", szServiceName,GetLastError()); } }else if (stricmp(lpCmdLine, "-stop") == 0) { bRet = ServiceCtrlStop(); if ( bRet == TRUE ) { Log( "Stop service %s success", szServiceName ); }else { Log( "Stop service %s failed[%d]", szServiceName,GetLastError()); } } else { Help(); } }else { if (!::StartServiceCtrlDispatcher(st)) { Help(); } } return 0; } //初始化相关结构 void 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; } //服务主线程函数,既用户选择开启服务时调用的函数 void WINAPI ServiceMain() { // Register the control request handler status.dwCurrentState = SERVICE_START_PENDING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; Log(_T("ServiceMain")); //注册服务控制 hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl); if (hServiceStatus == NULL) { Log(_T("Handler not installed")); return; } SetServiceStatus(hServiceStatus, &status); ////如下代码可以为启动服务前的准备工作 hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL ); if ( hEvent == NULL ) { status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); Log(_T("Failure to start service[%d]"),GetLastError()); return; } //更改服务状态为启动 status.dwWin32ExitCode = S_OK; status.dwCheckPoint = 0; status.dwWaitHint = 0; status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hServiceStatus, &status); //等待用户选择停止服务, //当然你也可以把你的服务代码用线程来执行, //此时这里只需等待线程结束既可。 while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 ) { //模拟服务的运行,应用时将主要任务放于此即可 Log(_T("Service runing...")); WorkFun(); } //停止服务 status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); Log(_T("Service stopped")); } //服务控制函数 void WINAPI ServiceStrl(DWORD dwOpcode) { switch (dwOpcode) { case SERVICE_CONTROL_STOP: status.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(hServiceStatus, &status); //告诉服务线程停止工作 ::SetEvent( hEvent ); Log(_T("want to stopped Service")); break; case SERVICE_CONTROL_PAUSE: break; case SERVICE_CONTROL_CONTINUE: break; case SERVICE_CONTROL_INTERROGATE: break; case SERVICE_CONTROL_SHUTDOWN: break; default: Log(_T("Bad service request")); } } //判断服务是否已安装 BOOL IsServiceInstalled() { BOOL bResult = FALSE; //打开服务控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM != NULL) { //打开服务 SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG); if (hService != NULL) { bResult = TRUE; ::CloseServiceHandle(hService); } ::CloseServiceHandle(hSCM); } return bResult; } //安装服务 BOOL InstallService() { if (IsServiceInstalled()) 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, szServiceName, szServiceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动 SERVICE_ERROR_NORMAL, szFilePath, NULL, NULL, _T(""), NULL, NULL); if (hService == NULL) { ::CloseServiceHandle(hSCM); return FALSE; } ::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); return TRUE; } //删除服务 BOOL UninstallService() { if (!IsServiceInstalled()) return TRUE; SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { return FALSE; } SC_HANDLE hService = ::OpenService(hSCM, szServiceName, 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; Log(_T("Service could not be deleted[%d]"),GetLastError()); return FALSE; } //开启服务 BOOL ServiceCtrlStart() { BOOL bRet; SC_HANDLE hSCM; SC_HANDLE hService; hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT); if (hSCM!=NULL) { hService=OpenService( hSCM, szServiceName, SERVICE_START); if (hService!=NULL) { //开始Service bRet = StartService(hService,0,NULL); CloseServiceHandle(hService); }else { bRet = FALSE; } CloseServiceHandle(hSCM); }else { bRet = FALSE; } return bRet; } //停止服务 BOOL ServiceCtrlStop() { 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, szServiceName, 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; } int WorkFun() { //workiing return 0; }