본문 바로가기
C++/MFC

[MFC] Windows Service 시작 / 중지 상태 확인 제어 예제

by Hwoarang757 2023. 6. 27.

아래는 Windows Printer Spooler ( spooler ) 서비스 시작 중지 예제 입니다.

 

        if (bResult == TRUE) {
               StopSpooler();
               Sleep(2000);
               StartSpooler();
        }


BOOL StopSpooler() {
         SC_HANDLE schService;
         SC_HANDLE schSCManager;

         // Machine NULL=local , database NULL= default
         schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);

         if (!schSCManager) {
                  Log(L"%s OpenSCMManager 함수 호출이 실패 하였습니다. GetLastError=%d", __FUNCTIONW__, GetLastError());
                  return FALSE;
         }

         schService = OpenService(schSCManager, L"spooler", SERVICE_STOP | SERVICE_QUERY_STATUS);

         BOOL bRet = FALSE;

         if (schService) {
                  SERVICE_STATUS ssStatus;
                  if (ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)) {
                           Sleep(500);
                           while (QueryServiceStatus(schService, &ssStatus)) {
                                    if (ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
                                             Sleep(1000);
                                    else if (ssStatus.dwCurrentState == SERVICE_STOPPED) {
                                             bRet = TRUE;
                                             break;
                                    }
                                    else {
                                             Log(L"%s 서비스 상태를 확인 할 수 없습니다. 상태코드=%d", __FUNCTIONW__, ssStatus.dwCurrentState);
                                             break;
                                    }
                           }
                  }
                  else
                           Log(L"%s ControlService 함수 호출이 실패 하였습니다.. GetLastError=%d", __FUNCTIONW__, GetLastError());
                           
                  CloseServiceHandle(schService);
         }
         else
                  Log(L"%s OpenService 함수 호출이 실패 하였습니다.. GetLastError=%d", __FUNCTIONW__, GetLastError());

         CloseServiceHandle(schSCManager); 
         return bRet;
}

 
BOOL StartSpooler() {
         SC_HANDLE schService;
         SC_HANDLE schSCManager;

         // Machine NULL=local , database NULL= default
         schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
         
         if (!schSCManager) {
                  Log(L"%s OpenSCMManager 함수 호출이 실패 하였습니다. GetLastError=%d", __FUNCTIONW__, GetLastError());
                  return FALSE;
         }

         schService = OpenService(schSCManager, L"spooler", SERVICE_START | SERVICE_QUERY_STATUS);

         if (schService) {
                  SERVICE_STATUS ssStatus;
                  if (StartService(schService , 0 , NULL) ) {
                           Sleep(500);
                           
                           while (QueryServiceStatus(schService, &ssStatus)) {
                                    if (ssStatus.dwCurrentState == SERVICE_RUNNING)
                                             break;
                                    else if (ssStatus.dwCurrentState == SERVICE_START_PENDING) {
                                             Sleep(1000);
                                             break;
                                    }
                                    else {
                                             Log(L"%s 서비스 상태를 확인 할 수 없습니다. 상태코드=%d", __FUNCTIONW__, ssStatus.dwCurrentState);
                                             break;
                                    }
                           }
                  }
                  else
                           Log(L"%s ControlService 함수 호출이 실패 하였습니다.. GetLastError=%d", __FUNCTIONW__, GetLastError());

                  CloseServiceHandle(schService);
         }
         else
                  Log(L"%s OpenService 함수 호출이 실패 하였습니다.. GetLastError=%d", __FUNCTIONW__, GetLastError());


         CloseServiceHandle(schSCManager);

         return TRUE;
}