개념도 없이, 아무것도 없이 갑자기 웬? 서비스의 설치? 코딩 한줄도 못만들어 봤는데.. -_-???

작성한 서비스 프로그램을 돌려 보려면, 일단 서비스를 설치해서 구동해야 한다.
그냥 콘솔 상태에서 아무리 디버깅해봐야 실제로 서비스 레이어에서 구동할 때 정상적인지...
실제로 서비스로 돌아는 가는지 확인해 봐야 할것 아닌가?

일단 아주 심플한 서비스 설치용 함수이다.
인자 중에 NULL 라고 된것들은 첨에 알아봐야 머리만 아프고
별로 쓸일이 없는 경우이다. 예제 만들다 필요하면 설명이 추가될 수 도 있을것 같은데 잘 모르겠다.

해당 소스를 사용하려면
   헤더파일 : #include <windows.h>
   라이브러리 : Advapi32.lib
                   : 코드로 라이브러리를 추가하려면 #pragma comment(lib, "Advapi32.lib")
가 있어야 한다.

DWORD ServiceInstall()
{
    DWORD RET = ERROR_SUCCESS;
    SC_HANDLE hSrv;

    // SCM 을 열어서 서비스에 작업을 진행할 수 있도록 핸들을 하나 달라고 하자.
    // 지금 할 작업은 새로운 서비스를 만들어 등록하는 작업이다.
    SC_HANDLE hScm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
        
    // 열지 못하면 에러다. 머 어쩔 수 없다. 왜 그런지 에러 코드나 리턴한다.
    if (hScm == NULL)
        return GetLastError();
           
    // SCM 을 서비스 생성 권한으로 열었으니, 서비스를 만들어야지..
    // 함수에 필요한 인자들을 채워서 넣어주면 된다. 
    // 첫번째 인자는 SCM 에서 넘겨준 핸들이고 나머지는 밑에다가 추가적으로 설명을 단다.

    hSrv = CreateService(
        hScm,
        (1)서비스 이름,
        (2)서비스 표시 이름,
        (3)서비스 액세스 권한,
        (4)서버스 타입,
        (5)서비스 시작 타입,
        (6)서비스 에러 제어,
        (7)서비스 파일 경로,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL);
    
    // 서비스 생성이 실패하면 별수 없다. 여러가지 이유가 있을 테니까..
    // 에러 코드나 리턴하자.

    if (hSrv == NULL)
    {
        RET = GetLastError();
        CloseServiceHandle(hScm);
        return RET;
    }
    else
    {
        // 와우 서비스 생성에 성공했네...
        // 서비스 관리자 (services.msc) 를 열어보면 해당 서비스마다, 친절하게 이건 무신 무신 서비스 입니다.
        // 라는 설명을 보았을 것이다. 그와 같은 설명을 달아주는 부분이다.
        // 구지 설명 달아줄 필요가 없으면 건너 띄어도 무방하다.
        lpDes.lpDescription=(8)서비스의 세부 설명;
        if(!ChangeServiceConfig2(hSrv, SERVICE_CONFIG_DESCRIPTION, &lpDes))
        {
            RET = GetLastError();
            CloseServiceHandle(hScm);
            CloseServiceHandle(hSrv);
            return RET;
        }
        
        CloseServiceHandle(hScm);     
        return CloseServiceHandle(hSrv) ? ERROR_SUCCESS : GetLastError();
    }
}
윈도우에서 프로그램을 개발하다 보면, 응용 어플리케이션으로 만들었을 경우..
이런 저런 한계에 때문에 고민해 보신 분들이 있을 겁니다.

터미널 서버에서 프로그램을 구동시켜 놓았는데, 누군가 세션을 로그 오프 시켜버리면 꺼진다든지
아니면, 서버가 부팅되었는데 아무도 로그온을 시켜 놓지 않은 상태에서 (즉, 부팅만 된 상태)
돌아가야 한다던지.. 기타 등등 서버 계통에서는 많은 부분을 서비스 프로그램으로 개발하게 된다.

또한, 비스타 계열에서는 UAC 때문에 의외로 까탈스런 부분들이 많은데, 시스템을 건드리는 대부분을
서비스에 몰아놓고, 응응프로그램에서는 서비스와 통신하여 불필요한 경고창이 뜨지 않도록 할 수도 있다.

대충 아주 기본적인걸 살펴보면, 설치->시작->중지->제거 형태로 이루어지고 실제적인 수행은 일반 어플과
크게 다르지 않다. 몇몇 제약사항도 있고, 장점도 존재하므로 이런 것들은 나중에 살펴보도록 한다.

위의 과정을 나열하기 전에 알아두어야할 개념으로 SCM (Service Control Manager) 이라는 용어에 익숙해지자.
윈도우즈 시스템에서 서비스를 제어하는 관리자이며 필요한 대부분의 API를 제공해주는 키워드이다.



다음 장 부터, 서비스의 설치, 시작/중지, 서비스의 제거 형태로 먼저 진행을 한 후에..
기본적인 서비스의 틀을 가진 템플릿 형태의 프로그램을 제작하는 단계로 진행해 볼까 한다.

+ Recent posts