서비스 시작

서비스 또는 드라이버 서비스를 시작하기 위해 서비스 제어 프로그램은 StartService 함수를 사용합니다. 데이터베이스가 잠겨 있으면 StartService 함수가 실패합니다. 이 경우 서비스 제어 프로그램은 몇 초 동안 기다렸다가 StartService 를 다시 호출해야 합니다. QueryServiceLockStatus 함수를 호출하여 데이터베이스의 현재 잠금 상태 검사 수 있습니다.

서비스 제어 프로그램이 서비스를 시작하는 경우 StartService 함수를 사용하여 서비스의 ServiceMain 함수에 전달할 인수 배열을 지정할 수 있습니다. ServiceMain 함수를 실행하기 위해 새 스레드를 만든 후 StartService 함수가 반환됩니다. 서비스 제어 프로그램은 QueryServiceStatus 함수를 호출하여 SERVICE_STATUS 구조에서 새로 시작된 서비스의 상태 검색할 수 있습니다. 초기화하는 동안 dwCurrentState 멤버는 SERVICE_START_PENDING 합니다. dwWaitHint 멤버는 서비스 제어 프로그램이 QueryServiceStatus를 다시 호출하기 전에 대기해야 하는 시간을 나타내는 시간 간격(밀리초)입니다. 초기화가 완료되면 서비스는 dwCurrentState 를 SERVICE_RUNNING 변경합니다.

서비스 제어 관리자는 시작 시 사용자 지정 환경 변수를 서비스에 전달하는 것을 지원하지 않습니다. 또한 서비스 제어 관리자는 서비스가 실행 중일 때 변경 내용을 검색하여 환경 변수에 전달하지 않습니다. 환경 변수에 종속된 서비스를 만드는 대신 레지스트리 값 또는 ServiceMain 인수를 사용합니다.

다음은 서비스 제어 관리자가 일반적인 서비스를 시작할 때 발생하는 일에 대한 간소화된 개요입니다.

  • SCM은 레지스트리에서 서비스 경로를 읽고 서비스를 시작할 준비를 합니다. 여기에는 서비스 잠금 획득이 포함됩니다. 서비스 잠금이 유지되는 동안 다른 서비스를 시작하려는 시도는 서비스 잠금이 해제될 때까지 차단됩니다.
  • SCM은 프로세스를 시작하고 자식 프로세스가 종료되거나(실패를 나타낸) SERVICE_RUNNING 상태 보고할 때까지 기다립니다.
  • 애플리케이션은 매우 간단한 초기화를 수행하고 StartServiceCtrlDispatcher 함수를 호출합니다.
  • StartServiceCtrlDispatcher 는 서비스 제어 관리자에 연결하고 서비스에 대한 ServiceMain 함수를 호출하는 두 번째 스레드를 시작합니다. ServiceMain은 가능한 한 빨리 SERVICE_RUNNING 보고해야 합니다.
  • 서비스 제어 관리자에 서비스가 실행 중이라는 알림이 표시되면 서비스 잠금이 해제됩니다.

서비스가 80초 이내에 상태 업데이트하지 않고 마지막 대기 힌트가 있는 경우 서비스 제어 관리자는 서비스가 응답을 중지했음을 확인합니다. 서비스 제어 관리자는 이벤트를 기록하고 서비스를 중지합니다.

프로그램이 드라이버 서비스를 시작하는 경우 디바이스 드라이버가 초기화를 완료한 후 StartService 가 반환됩니다.

자세한 내용은 서비스 시작을 참조하세요.