StartServiceA 함수(winsvc.h)
서비스를 시작합니다.
통사론
BOOL StartServiceA(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCSTR *lpServiceArgVectors
);
매개 변수
[in] hService
서비스에 대한 핸들입니다. 이 핸들은 OpenService 또는 CreateService 함수에서 반환되며 SERVICE_START 액세스 권한이 있어야 합니다. 자세한 내용은 Service Security and Access Rights참조하세요.
[in] dwNumServiceArgs
lpServiceArgVectors 배열의 문자열 수입니다. lpServiceArgVectors NULL인 경우 이 매개 변수는 0일 수 있습니다.
[in, optional] lpServiceArgVectors
서비스에 대한 ServiceMain 함수에 인수로 전달할 null로 종료된 문자열입니다. 인수가 없으면 이 매개 변수는 NULL일 수 있습니다. 그렇지 않으면 첫 번째 인수(lpServiceArgVectors[0])는 서비스의 이름이며, 그 다음에는 추가 인수(lpServiceArgVectors[1]~lpServiceArgVectors[dwNumServiceArgs-1])가 옵니다.
드라이버 서비스는 이러한 인수를 수신하지 않습니다.
반환 값
함수가 성공하면 반환 값은 0이 아닌 값입니다.
함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 얻으려면 GetLastError호출합니다.
서비스 제어 관리자에서 다음 오류 코드를 설정할 수 있습니다. 다른 항목은 서비스 제어 관리자가 호출하는 레지스트리 함수에서 설정할 수 있습니다.
반환 코드 | 묘사 |
---|---|
|
핸들에 SERVICE_START 액세스 권한이 없습니다. |
|
핸들이 잘못되었습니다. |
|
서비스 이진 파일을 찾을 수 없습니다. |
|
서비스 인스턴스가 이미 실행 중입니다. |
|
데이터베이스가 잠겨 있습니다. |
|
서비스는 존재하지 않거나 삭제로 표시된 서비스에 따라 달라집니다. |
|
서비스는 시작하지 못한 다른 서비스에 따라 달라집니다. |
|
서비스를 사용할 수 없습니다. |
|
로그온 실패로 인해 서비스가 시작되지 않았습니다. 이 오류는 서비스가 "서비스로 로그온" 권한이 없는 계정으로 실행되도록 구성된 경우에 발생합니다. |
|
서비스가 삭제로 표시되었습니다. |
|
서비스에 대한 스레드를 만들 수 없습니다. |
|
서비스에 대한 프로세스가 시작되었지만 StartServiceCtrlDispatcher호출하지 않았거나 StartServiceCtrlDispatcher 호출한 스레드가 제어 처리기 함수에서 차단될 수 있습니다. |
발언
드라이버 서비스가 시작되면 디바이스 드라이버가 초기화를 완료할 때까지 StartService 함수가 반환되지 않습니다.
서비스가 시작되면 필요한 경우 SCM(서비스 제어 관리자)이 서비스 프로세스를 생성합니다. 지정된 서비스가 다른 서비스와 프로세스를 공유하는 경우 필요한 프로세스가 이미 있을 수 있습니다. StartService 함수는 시간이 걸릴 수 있으므로 새 서비스의 첫 번째 상태 업데이트를 기다리지 않습니다. 대신 SCM이 서비스 제어 디스패처로부터 이 서비스에 대한 ServiceMain 스레드가 성공적으로 생성되었다는 알림을 받으면 반환됩니다.
SCM은 StartService반환하기 전에 다음 기본 상태 값을 설정합니다.
- 서비스의 현재 상태가 SERVICE_START_PENDING 설정됩니다.
- 허용되는 컨트롤은 없음(0)으로 설정됩니다.
- CheckPoint 값이 0으로 설정됩니다.
- WaitHint 시간은 2초로 설정됩니다.
초기화하는 동안 서비스는 StartService 호출할 수 없습니다. 그 이유는 SCM이 초기화 중에 서비스 제어 데이터베이스를 잠그므로 StartService 대한 호출이 차단됩니다. 서비스가 SCM에 성공적으로 시작되었다고 보고한 후 StartService호출할 수 있습니다.
ControlService마찬가지로 StartService 서비스가 제어 코드를 처리하는 동안 30초 동안 차단됩니다. 시간 제한이 만료되는 동안 사용 중인 서비스가 처리기 함수에서 아직 반환되지 않은 경우 ERROR_SERVICE_REQUEST_TIMEOUT StartService 실패합니다. 이는 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