1. 서비스 처리 [Bottom] [Top]
typedef VOID (WINAPI *LPSERVICE_MAIN_FUNCTION)( DWORD dwNumServicesArgs, LPTSTR * lpServiceArgVectors ); typedef struct _SERVICE_TABLE_ENTRY { LPTSTR lpServiceName; LPSERVICE_MAIN_FUNCTION lpServiceProc; } SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY; //------------------------------------------------------------------------------ BOOL StartServiceCtrlDispatcher( const LPSERVICE_TABLE_ENTRY lpServiceTable );
typedef VOID (WINAPI *LPHANDLER_FUNCTION)( DWORD dwControl ); typedef DWORD (WINAPI *LPHANDLER_FUNCTION_EX)( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext ); //------------------------------------------------------------------------------ SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler( LPCTSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc ); SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerEx( LPCTSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext );
typedef struct _SERVICE_STATUS { DWORD dwServiceType; DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS; //------------------------------------------------------------------------------ BOOL SetServiceStatus( SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus );
2. 서비스 등록/제거 [Bottom] [Top]
- 서비스 등록
sc.exe create {서비스 이름} binpath= {서비스 실행 파일의 절대 경로} displayname= {서비스 관리자에 표시될 이름} sc.exe description {서비스 이름} {서비스 관리자에 표시될 설명} - 서비스 제거
sc.exe delete {서비스 이름} 참고> sc.exe 사용법 NT Service Controller
3. 서비스 제어 [Bottom] [Top]
1 // File: Win32/WinSvc_Summary.cpp 2 3 // WinSvc_Summary.cpp : Windows Service 간략히 정리 4 // 5 6 #define SERVICE_NAME _T( "Service" ) 7 8 //------------------------------------------------------------------------------ 9 10 SC_HANDLE hSCM = NULL; 11 SC_HANDLE hSVC = NULL; 12 SERVICE_STATUS svcStatus; 13 14 BOOL bResult = FALSE; 15 16 //------------------------------------------------------------------------------ 17 18 // STEP 0: 서비스 관리자 연결. 19 hSCM = OpenSCManager( NULL, NULL, GENERIC_READ ); 20 if( NULL == hSCM ) 21 { 22 // ERROR: 서비스 관리자 접근 오류 발생. (오류 코드: GetLastError()) 23 return; 24 } 25 26 // STEP 1: 서비스 연결(설치 여부 확인). 27 hSVC = OpenService( hSCM, SERVICE_NAME, SERVICE_ALL_ACCESS ); 28 if( NULL == hSVC ) 29 { 30 // ERROR: 서비스가 설치되어 있지 않음. (오류 코드: GetLastError()) 31 return; 32 } 33 34 // STEP 2: 서비스 시작. 35 bResult = StartService( hSVC, 0, NULL ); 36 if( FALSE == hSVC ) 37 { 38 // ERROR: 서비스 시작 오류 발생. (오류 코드: GetLastError()) 39 return; 40 } 41 42 // STEP 3: 서비스 일시 중지. 43 bResult = ControlService( hSVC, SERVICE_CONTROL_PAUSE, &svcStatus ); 44 if( FALSE == hSVC ) 45 { 46 // ERROR: 서비스 일시 중지 오류 발생. (오류 코드: GetLastError()) 47 } 48 49 // STEP 4: 일시 중지된 서비스 다시 시작. 50 bResult = ControlService( hSVC, SERVICE_CONTROL_CONTINUE, &svcStatus ); 51 if( FALSE == hSVC ) 52 { 53 // ERROR: 일시 중지된 서비스 다시 시작 오류 발생. (오류 코드: GetLastError()) 54 } 55 56 // STEP 5: 서비스 상태 확인. 57 bResult = ControlService( hSVC, SERVICE_CONTROL_INTERROGATE, &svcStatus ); 58 if( FALSE == hSVC ) 59 { 60 // ERROR: 서비스 상태 확인 오류 발생. (오류 코드: GetLastError()) 61 } 62 63 switch( svcStatus.dwCurrentState ) 64 { 65 case SERVICE_START_PENDING: 66 case SERVICE_PAUSE_PENDING: 67 case SERVICE_CONTINUE_PENDING: 68 case SERVICE_STOP_PENDING: 69 // svcStatus.dwWaitHint 값만큼 대기 후 다시 서비스 상태 확인. 70 // svcStatus.dwCheckPoint 값으로 진행상태(ProgressBar) 처리. 71 break; 72 73 case SERVICE_RUNNING: 74 case SERVICE_PAUSED: 75 case SERVICE_STOPPED: 76 default: 77 // 일정 시간 간격으로 서비스 상태 확인. 78 } 79 80 // STEP 6: 서비스 종료. 81 bResult = ControlService( hSVC, SERVICE_CONTROL_STOP, &svcStatus ); 82 if( FALSE == hSVC ) 83 { 84 // ERROR: 서비스 종료 오류 발생. (오류 코드: GetLastError()) 85 } 86 87 // STEP 7: 서비스/서비스 관리자 해제. 88 CloseServiceHandle( hSVC ); 89 CloseServiceHandle( hSCM );
