LPSERVICE_MAIN_FUNCTIONA 콜백 함수(winsvc.h)
서비스의 진입점입니다.
LPSERVICE_MAIN_FUNCTION 형식은 이 콜백 함수에 대한 포인터를 정의합니다. ServiceMain 은 애플리케이션 정의 함수 이름의 자리 표시자입니다.
구문
LPSERVICE_MAIN_FUNCTIONA LpserviceMainFunctiona;
void LpserviceMainFunctiona(
[in] DWORD dwNumServicesArgs,
[in] LPSTR *lpServiceArgVectors
)
{...}
매개 변수
[in] dwNumServicesArgs
lpServiceArgVectors 배열의 인수 수입니다.
[in] lpServiceArgVectors
서비스를 시작한 StartService 함수를 호출하여 서비스에 전달된 null로 종료된 인수 문자열입니다. 인수가 없는 경우 이 매개 변수는 NULL일 수 있습니다. 그렇지 않으면 첫 번째 인수(lpServiceArgVectors[0])는 서비스의 이름이고 그 뒤에 추가 인수(lpServiceArgVectors[1]~lpServiceArgVectors[dwNumServicesArgs-1])가 옵니다.
사용자가 제어판 서비스 스냅인을 사용하여 수동 서비스를 시작하는 경우 lpServiceArgVectors 매개 변수의 문자열은 서비스의 속성 대화 상자에서 가져옵니다(서비스 스냅인에서 서비스 항목을 마우스 오른쪽 단추로 클릭하고 속성을 클릭한 다음 시작 매개 변수에 매개 변수를 입력합니다.)
반환 값
없음
설명
서비스 프로그램은 하나 이상의 서비스를 시작할 수 있습니다. 서비스 프로세스에는 시작할 수 있는 각 서비스에 대한 SERVICE_TABLE_ENTRY 구조가 있습니다. 구조체는 서비스 이름과 해당 서비스의 ServiceMain 함수에 대한 포인터를 지정합니다.
서비스 제어 관리자가 서비스 시작 요청을 받으면 서비스 프로세스가 시작됩니다(아직 실행되지 않은 경우). 서비스 프로세스의 기본 스레드는 SERVICE_TABLE_ENTRY 구조체 배열에 대한 포인터를 사용하여 StartServiceCtrlDispatcher 함수를 호출합니다. 그런 다음 서비스 제어 관리자는 이 서비스 프로세스에 대한 서비스 제어 디스패처에 시작 요청을 보냅니다. 서비스 제어 디스패처는 시작 중인 서비스의 ServiceMain 함수를 실행하는 새 스레드를 만듭니다.
ServiceMain 함수는 RegisterServiceCtrlHandlerEx 함수를 즉시 호출하여 제어 요청을 처리할 HandlerEx 함수를 지정해야 합니다. 다음으로 SetServiceStatus 함수를 호출하여 서비스 제어 관리자에 상태 정보를 보내야 합니다. 이러한 호출 후 함수는 서비스의 초기화를 완료해야 합니다. ServiceMain 함수에서 다른 서비스를 시작하려고 시도하지 마세요.
SCM(서비스 제어 관리자)은 서비스가 SERVICE_RUNNING 상태 보고할 때까지 기다립니다. SCM과의 상호 작용이 필요한 시스템의 다른 구성 요소가 이 시간 동안 차단되므로 이 상태 최대한 빨리 보고하는 것이 좋습니다. 일부 함수에는 직접 또는 간접적으로 SCM과의 상호 작용이 필요할 수 있습니다.
SCM은 초기화 중에 서비스 제어 데이터베이스를 잠그므로 초기화 중에 서비스가 StartService 를 호출하려고 하면 호출이 차단됩니다. 서비스가 SCM에 성공적으로 시작되었다고 보고하면 StartService를 호출할 수 있습니다. 서비스에서 다른 서비스를 실행해야 하는 경우 서비스는 필요한 종속성을 설정해야 합니다.
또한 서비스 초기화 중에는 시스템 함수를 호출해서는 안 됩니다. 서비스 코드는 SERVICE_RUNNING 상태 보고한 후에만 시스템 함수를 호출해야 합니다.
ServiceMain 함수는 전역 이벤트를 만들고, 이 이벤트에서 RegisterWaitForSingleObject 함수를 호출하고, 종료해야 합니다. 그러면 ServiceMain 함수를 실행하는 스레드가 종료되지만 서비스가 종료되지는 않습니다. 서비스가 중지되면 서비스 제어 처리기는 SERVICE_STOP_PENDING 사용하여 SetServiceStatus 를 호출하고 이 이벤트에 신호를 보내야 합니다. 스레드 풀의 스레드는 대기 콜백 함수를 실행합니다. 이 함수는 전역 이벤트 닫기를 포함하여 클린 작업을 수행하고 SERVICE_STOPPED SetServiceStatus를 호출해야 합니다. 서비스가 중지된 후에는 서비스가 시작 컨트롤을 수신하고 ServiceMain 이 다시 호출되는 경우 경합 조건을 도입할 수 있으므로 추가 서비스 코드를 실행해서는 안 됩니다. 이 문제는 여러 서비스가 프로세스를 공유할 때 발생할 가능성이 높습니다.
예제
참고
winsvc.h 헤더는 LPSERVICE_MAIN_FUNCTION 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | winsvc.h(Windows.h 포함) |