Project Hub

2. ServiceApp 구현 및 서비스 실행 본문

Windows/Windows Service

2. ServiceApp 구현 및 서비스 실행

safy 2022. 8. 6. 19:00
728x90
반응형

SCM 으로 서비스에 등록 할 ServiceApp을 구현하였다.

 

구현 중에 발생한 문제

 

구현 시, 테스트를 위해 windows event 객체를 생성하였는데 처음에는 ServiceApp에서 CreateEvent 를 하였다.

하지만, 원인은 모르지만 SCM에서 해당 이벤트 객체를 signal 상태로 변경하기 위해 OpenEvent를 하였는데

액세스 거부 에러가 발생하였다. 

 

그래서 SCM 시작 시, Global 이벤트 객체를 생성하고, 그 후에 ServiceApp 에서 접근하도록 변경하였고 의도하는 동작대로 수행되었다.

 

ServiceApp class의 기본 구조

#pragma once

#include <stdio.h>
#include <Windows.h>

#define SERVICE_NAME L"Safy"
#define EVENT_NAME	L"Global\\SAFY"

class CServiceApp
{
public:
	CServiceApp();
	virtual ~CServiceApp();

public:
	static void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
	static void WINAPI ControlNTService(DWORD dwCtrlCode);
	static BOOL InitService();
	static BOOL ExitService();
	static BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint);
	static int ServiceSpecific(int argc, LPTSTR argv[]);

	DWORD Run();

};

 

테스트 수행 과정

- ServiceApp.exe 파일 생성 (ServiceApp 프로젝트 빌드)

- SCM 을 통해 'Safy' 라는 이름의 서비스를 등록 (서비스로 등록 할 프로세스 지정 - ServiceApp 경로/ServiceApp.exe)

- SCM 을 통해 서비스 시작

- ServiceApp.exe 실행되며 해당 앱의 Main에서 WaitForSingleObject를 통해 SetEvent 호출을 기다리도록 함.

- SCM 에서 SetEvent를 통해 종료 시그널 알리고 서비스 종료.

 

테스트 확인 내용

- services.msc 를 통해 서비스로 등록된 Safy 확인

등록된 Safy
Safy 서비스의 속성

- 등록 후, 서비스 시작 시 실행된 ServiceApp.exe

시작된 ServiceApp

정리

- 서비스 등록과 실행, 종료까지 테스트를 수행하였다.

- 서비스의 속성을 수정하여 강제 종료 방지, 부팅 시 자동 실행 등 설정 가능하다. (해당 내용들은 추후에 조사 후 적용..)

728x90
반응형
Comments