关于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;}
这个是我的服务器自启动的代码,有安装服务,启动服务,停止服务,和卸载服务的功能,这些功能都是好的,但是停止服务的时候,服务所启动的进程不会停止,为什么?我的代码哪里有什么问题,代码有点多,不好意思啊
[解决办法]
在OpenService的权限中加入SERVICE_ALL_ACCESS看看是否可以
[解决办法]
[解决办法]