C++/서비스 상태 쿼리

  1. #ifndef SAFEFREE
  2. #   define SAFEFREE(x) if(x){ ::free((void *)x); x = NULL; }
  3. #endif
  4. ...
  5. TCHAR szServiceName[] = _T("myservice");
  6. SC_HANDLE hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  7. ENUM_SERVICE_STATUS *lpService = NULL;
  8. DWORD pcbBytesNeeded = 0;
  9. DWORD lpServicesReturned = 0;
  10. DWORD lpResumeHandle = 0;
  11. DWORD dwError = 0;
  12. if(!EnumServicesStatus(hScm, SERVICE_WIN32, SERVICE_ACTIVE, NULL, 0,
  13.     &pcbBytesNeeded, &lpServicesReturned, &lpResumeHandle) ||
  14.     (dwError = GetLastError() ) == ERROR_MORE_DATA)
  15. {
  16.     DWORD dw_Bytes = pcbBytesNeeded + sizeof(ENUM_SERVICE_STATUS);
  17.     lpService = (ENUM_SERVICE_STATUS *) malloc(dw_Bytes) ;
  18.     lpResumeHandle=NULL ;
  19.     if(!EnumServicesStatus(hScm, SERVICE_WIN32, SERVICE_ACTIVE, lpService, dw_Bytes,
  20.         &pcbBytesNeeded, &lpServicesReturned, &lpResumeHandle) )
  21.     {
  22.         dwError = GetLastError();
  23.         // _T("%s GetActiveStatus() fail, GetLastError=%d"), szServiceName, dwError);
  24.         SAFEFREE(lpService) ;
  25.         CloseServiceHandle(hScm);
  26.         return 0;
  27.     }
  28.     BOOL bFound = FALSE;
  29.     for (DWORD i=0; i < lpServicesReturned; i++)
  30.     {
  31.         CString finder(lpService[i].lpServiceName);
  32.         if (finder.Compare(szServiceName) == 0)
  33.         {
  34.             // Current State
  35.             if (lpService[i].ServiceStatus.dwCurrentState == SERVICE_RUNNING)
  36.             {
  37.                 // _T("%s service is running"), szServiceName);
  38.             }
  39.             else
  40.             {
  41.                 // _T("%s service not running, CurrentState=%d"), szServiceName, lpService[i].ServiceStatus.dwCurrentState);
  42.             }
  43.             bFound = TRUE;
  44.             break;
  45.         }
  46.     }
  47.     if (bFound == FALSE)
  48.     {
  49.         // _T("%s service not created"), szServiceName);
  50.     }
  51. }
  52. SAFEFREE(lpService);
  53. CloseServiceHandle(hScm);

이 글에는 0 개의 댓글이 있습니다.