다음을 통해 공유


StartServiceA 함수(winsvc.h)

서비스를 시작합니다.

구문

BOOL StartServiceA(
  [in]           SC_HANDLE hService,
  [in]           DWORD     dwNumServiceArgs,
  [in, optional] LPCSTR    *lpServiceArgVectors
);

매개 변수

[in] hService

서비스에 대한 핸들입니다. 이 핸들은 OpenService 또는 CreateService 함수에서 반환되며 SERVICE_START 액세스 권한이 있어야 합니다. 자세한 내용은 서비스 보안 및 액세스 권한을 참조하세요.

[in] dwNumServiceArgs

lpServiceArgVectors 배열의 문자열 수입니다. lpServiceArgVectors가 NULL인 경우 이 매개 변수는 0일 수 있습니다.

[in, optional] lpServiceArgVectors

서비스의 ServiceMain 함수에 인수로 전달할 null로 종료된 문자열입니다. 인수가 없는 경우 이 매개 변수는 NULL일 수 있습니다. 그렇지 않으면 첫 번째 인수(lpServiceArgVectors[0])는 서비스의 이름이고 그 뒤에 추가 인수(lpServiceArgVectors[1]~lpServiceArgVectors[dwNumServiceArgs-1])가 옵니다.

드라이버 서비스는 이러한 인수를 수신하지 않습니다.

반환 값

함수가 성공하면 반환 값이 0이 아닙니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

서비스 제어 관리자가 설정할 수 있는 오류 코드는 다음과 같습니다. 다른 함수는 서비스 제어 관리자가 호출하는 레지스트리 함수에 의해 설정할 수 있습니다.

반환 코드 설명
ERROR_ACCESS_DENIED
핸들에 SERVICE_START 액세스 권한이 없습니다.
ERROR_INVALID_HANDLE
핸들이 잘못되었습니다.
ERROR_PATH_NOT_FOUND
서비스 이진 파일을 찾을 수 없습니다.
ERROR_SERVICE_ALREADY_RUNNING
서비스의 인스턴스가 이미 실행 중입니다.
ERROR_SERVICE_DATABASE_LOCKED
데이터베이스가 잠겨 있습니다.
ERROR_SERVICE_DEPENDENCY_DELETED
서비스는 존재하지 않거나 삭제로 표시된 서비스에 따라 달라집니다.
ERROR_SERVICE_DEPENDENCY_FAIL
서비스는 시작하지 못한 다른 서비스에 따라 달라집니다.
ERROR_SERVICE_DISABLED
서비스가 비활성화되었습니다.
ERROR_SERVICE_LOGON_FAILED
로그온 오류로 인해 서비스를 시작하지 못했습니다. 이 오류는 서비스가 "서비스로 로그온" 권한이 없는 계정으로 실행되도록 구성된 경우에 발생합니다.
ERROR_SERVICE_MARKED_FOR_DELETE
서비스가 삭제로 표시되었습니다.
ERROR_SERVICE_NO_THREAD
서비스에 대한 스레드를 만들 수 없습니다.
ERROR_SERVICE_REQUEST_TIMEOUT
서비스에 대한 프로세스가 시작되었지만 StartServiceCtrlDispatcher를 호출하지 않았거나 StartServiceCtrlDispatcher 라는 스레드가 제어 처리기 함수에서 차단될 수 있습니다.

설명

드라이버 서비스가 시작되면 디바이스 드라이버 초기화가 완료될 때까지 StartService 함수가 반환되지 않습니다.

서비스가 시작되면 필요한 경우 SCM(서비스 제어 관리자)이 서비스 프로세스를 생성합니다. 지정된 서비스가 다른 서비스와 프로세스를 공유하는 경우 필요한 프로세스가 이미 있을 수 있습니다. StartService 함수는 시간이 걸릴 수 있으므로 새 서비스의 첫 번째 상태 업데이트를 기다리지 않습니다. 대신 SCM이 서비스 제어 디스패처로부터 이 서비스에 대한 ServiceMain 스레드가 성공적으로 생성되었다는 알림을 받으면 를 반환합니다.

SCM은 StartService에서 반환하기 전에 다음과 같은 기본 상태 값을 설정합니다.

  • 서비스의 현재 상태가 SERVICE_START_PENDING 설정됩니다.
  • 허용되는 컨트롤은 없음(0)으로 설정됩니다.
  • CheckPoint 값이 0으로 설정됩니다.
  • WaitHint 시간은 2초로 설정됩니다.
호출 프로세스는 서비스의 상태 쿼리하기 위해 QueryServiceStatus 함수를 주기적으로 호출하여 새 서비스가 초기화를 완료했는지 여부를 확인할 수 있습니다.

초기화 중에는 서비스에서 StartService를 호출할 수 없습니다. 그 이유는 SCM이 초기화 중에 서비스 제어 데이터베이스를 잠그므로 StartService 에 대한 호출이 차단됩니다. 서비스가 SCM에 성공적으로 시작되었음을 보고한 후 StartService를 호출할 수 있습니다.

ControlService와 마찬가지로 서비스가 컨트롤 코드를 처리하는 데 사용 중인 경우 StartService는 30초 동안 차단됩니다. 시간 제한이 만료되면 사용 중인 서비스가 처리기 함수에서 아직 반환되지 않은 경우 StartService 는 ERROR_SERVICE_REQUEST_TIMEOUT 함께 실패합니다. 이는 SCM이 한 번에 하나의 서비스 제어 알림만 처리하기 때문입니다.

예제

예제는 서비스 시작을 참조하세요.

참고

winsvc.h 헤더는 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 StartService를 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 winsvc.h(Windows.h 포함)
라이브러리 Advapi32.lib
DLL Advapi32.dll

추가 정보

ControlService

CreateService

DeleteService

OpenService

QueryServiceDynamicInformation

QueryServiceStatusEx

서비스 함수

서비스 시작

ServiceMain