Delphi를 사용하여 Win2000 서비스 프로그램 작성
개요: 이 기사에서는 Win2000 서비스 프로그램을 작성하기 위해 Delphi를 사용하는 방법을 소개합니다. 관련된 클래스는 TServiceApplicatoin, TService, TServiceThread 등입니다.
키워드: 서비스/서비스
1. Win2000 서비스 소개
서비스 응용 프로그램은 WinNT에서 실행되는 백그라운드 프로그램입니다. 각 서비스 응용 프로그램은 여러 서비스를 포함할 수 있으며 각 서비스는 스레드 중 하나입니다(서비스는 여러 하위 서비스 스레드를 만들 수도 있음). 서비스를 사용함으로써 응용 프로그램은 특별한 권한을 얻을 수 있으며 사용자는 Win2000 작업 관리자를 통해 프로그램을 직접 종료하지 않으므로 서비스는 종종 특별한 목표를 달성하는 데 사용됩니다.
Win2000 제어판의 서비스 관리 도구를 통해 서비스 특성을 설정/볼 수 있습니다.
(1) 서비스 이름, (2) 표시 이름, (4) 시작 유형,
그 중 서비스 이름은 서비스를 식별합니다.
Win2000의 C:/WINNT/System32/services.exe 프로그램을 예로 들어 보겠습니다. 이 Exe 파일은 서비스 응용 프로그램에 해당하며 exe에는 Alerter와 같은 여러 서비스(서비스)가 포함되어 있습니다. DHCP(DHCP) 클라이언트), 메신저 등 당사가 서비스를 종료하더라도 해당 서비스가 위치한 서비스 애플리케이션의 다른 서비스는 종료되지 않습니다.
Delphi에서 Borland 엔지니어는 수많은 세부 정보를 캡슐화하고 서비스 프로그램 개발을 단순화하는 TServiceApplication, TService, TServiceThread 및 기타 클래스를 제공합니다.
2. TServiceApplication
Delphi에서 TServiceApplication 클래스는 위에서 언급한 ServiceApplication에 해당합니다. Delphi 개발 환경을 사용하여 새로운 서비스 애플리케이션 PRoject를 생성하고 TService에서 상속된 클래스를 생성합니다. 프로젝트 파일의 Application 개체는 TServiceApplication 인스턴스입니다. 각 TServiceApplication에는 위에서 언급한 서비스 프로그램과 서비스 간의 정량적 관계와 정확히 일치하는 여러 TService 개체가 포함되어 있습니다.
TServiceApplication 및 TService 클래스의 정의를 읽으면 TServiceApplication이 TComponent 클래스에서 상속되고, TService가 TDataModule 클래스에서 상속되며, Application 객체가 각 TService 객체의 생성 및 삭제를 담당한다는 것을 알 수 있습니다. 다음 코드를 추적하세요
Application.CreateForm(TService1, Service1);
생성된 TService 객체의 소유자는 모두 Application 객체라는 것을 알 수 있습니다. VCL FrameWork에서는 소유자가 항상 각 구성 요소 객체를 파괴할 책임이 있으므로(VCL의 TComponent 클래스는 복합 모드를 채택합니다) TServiceApplication도 각 TService 객체를 파괴합니다.
TServiceApplication.Run의 코드에 따라 TServiceApplication이 먼저 실행 매개변수를 구문 분석하고 서비스의 설치 및 제거를 구현하는 것을 확인할 수 있습니다. 그런 다음 서비스 이름과 각 서비스 개체의 실행 항목이 포함된 ServiceStartTable 배열을 초기화합니다. 마지막으로 스레드 개체인 TServiceStartThread 개체를 생성하고 스레드에서 API: StartServiceCtrlDispatcher를 호출하여 ServiceStartTable에 지정된 여러 서비스를 시작합니다. ServiceApplication 기본 스레드는 서비스 중지/일시 중지 요청 수신과 같은 메시지를 계속 반복하고 처리합니다.
3. 티서비스
TService 클래스는 TDataModule 클래스에서 상속되는데, 이는 풍부한 기능을 달성하기 위해 많은 수의 VCL 컨트롤을 추가할 수 있음을 의미합니다. 또한 OnStart, OnPause, OnStop, OnContinue, OnCreate, OnShutDown 및 기타 이벤트도 처리할 수 있습니다. 설명해야 할 것은 다음과 같습니다. OnStop은 서비스가 중지되었음을 의미하고 OnShutDown은 ServiceApplication의 실행이 중지되었음을 의미하며 이는 두 서비스의 의미가 다릅니다.
앞서 언급했듯이 ServiceApplication은 StartServiceCtrlDispatcher를 호출하여 각 서비스를 시작합니다. StartServiceCtrlDispatcher는 TService.Main인 TService의 시작을 시작합니다. TService.Main은 먼저 서비스를 등록한 다음 TService.DoStart를 호출합니다. TService.DoStart는 스레드 객체인 내부 TServiceThread 멤버 객체를 생성합니다. TServiceThread.Execute를 검사하면 TService1.OnExecute를 처리할 때 TService가 처리를 위해 모든 요청을 TServiceThread 멤버 객체에 위임한다는 것을 알 수 있습니다. 기본 방법은 모든 요청을 처리합니다.
TService.ServiceExecute는 TService의 주요 콘텐츠입니다. 서비스가 정상적으로 실행되려면 집중해야 하는 목표(예: 특정 포트 수신 대기, 특정 작업 수행 등)를 처리하는 것 외에도 다음과 같은 외부 명령/요청에도 응답해야 합니다. 서비스를 종료, 일시 중지 및 재개합니다. 따라서 이 작업을 완료하고 ServiceExecute에서 외부 명령/요청을 처리하기 위해 전용 스레드를 생성하는 것을 고려할 수 있습니다. 따라서 코드는 다음과 같습니다.
종료되지 않은 동안 시작하십시오.
ServiceThread.ProcessRequests(False);
끝;
물론 OnExecute에서 특정 포트 수신과 같은 특정 작업을 처리할 수도 있지만 이로 인해 서비스가 중지/일시 중지 및 기타 요청에 적시에 응답하지 못하는 경우가 많습니다. OnExecute가 완료되면 서비스는 실제로 해당 작업을 완료했으며 곧 종료(종료)됩니다.
참고자료:
MSDN, Delphi VCL 소스 코드, Delphi 도움말 문서