[MFC] 서비스 프로그램


Development note/C , C++ , MFC  2012. 12. 2. 23:05

안녕하세요. 명월입니다.


이번 포스팅에서는 C++(MFC)에서 서비스에 등록하는 프로그램에 대해 알아보도록 하겠습니다.

이전에 C#으로 작성 된 코드가 있는데 비교해 보면서 작성해 보시면 도움이 되겠습니다.

바로가기 - [C#]서비스 프로그램 바로가기


그럼 먼저 코드 살펴보기에 앞서 어디에서 작동되는지 확인하겠습니다.

위에서 사용되는 프로그램입니다.

서비스 프로그램은 우리가 알고 있는 서버 프로그램이라고 생각하면 됩니다. 우리가 보통 실행하는 프로그램들은 항상 실행을 해주어야 실행되는 프로그램이지만 이 서비스 프로그램은 윈도우가 시작되면 실행되는 백그라운드 프로그램이라고 생각됩니다.

 

그럼 이 프로그램을 작성하고 등록하는 방법에 대해 알아 보겠습니다.

먼저 MFC 로 프로젝트를 실행하겠습니다.

 

그리고 먼저 아래 파일 두 개를 등록합니다. (이게 출처가 있는데 출처를 잃어버렸네요.. ㅜㅜ)

서비스 프로그램 참조 소스 :Service.cpp

서비스 프로그램 참조 소스 해더 :Service.h

소스를 추가했습니다.

그리고 필요한 해드를 선언하겠습니다.

#include <iostream>
#include <conio.h>
#include <WinSvc.h>

여기까지 하면 기본 설정이 완료되었습니다. (C++ 은 기본 설정이 항상 많아요..^^)

 

그럼 코딩으로 확인하겠습니다.

// 20121202_blog.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include "Service.h"
#include "20121202_blog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

using namespace std;

UINT MTServerThread(LPVOID pParam);
class CUpdateService: public CService
{
  public :
    CWinThread *_thread;
    void main(void)
    {
      CService::Begin(_T("명월서비스"));
      CService::End();
    }
  protected :
    void OnStarted()
    {
      _thread = AfxBeginThread(MTServerThread,0);
    }
    void OnStopped()
    {
      DWORD dwExitCode;
      GetExitCodeThread(_thread->m_hThread,&dwExitCode);
      WSACleanup();
    }
};
UINT MTServerThread(LPVOID pParam)
{
  return 0;
}
 
// 유일한 응용 프로그램 개체입니다.
 
CWinApp theApp;
 
using namespace std;
 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
  int nRetCode = 0;
  
  HMODULE hModule = ::GetModuleHandle(NULL);
  
  if (hModule != NULL)
  {
    // MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
    if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
    {
      // TODO: 오류 코드를 필요에 따라 수정합니다.
      _tprintf(_T("심각한 오류: MFC를 초기화하지 못했습니다.\n"));
      nRetCode = 1;
    }
    else
    {
      // TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
      CUpdateService upServ;
      if(argc == 2)
      {
        if(_tcscmp(argv[1],_T("-i")) == 0)
        {
          upServ.Install(_T("명월서비스"));
        }
        else if(_tcscmp(argv[1],_T("-u")) == 0)
        {
          upServ.Uninstall(_T("명월서비스"));
        }
        return true;
      }
      upServ.main();
    }
  }
  else
  {
    // TODO: 오류 코드를 필요에 따라 수정합니다.
    _tprintf(_T("심각한 오류: GetModuleHandle 실패\n"));
    nRetCode = 1;
  }
  
  return nRetCode;
}

 

이렇게 뜨면 컴파일이 잘 되는 것입니다.

이제 등록하겠습니다.

C#에서는 등록하기 위해서 installUtil 이란 파일을 가져와서 등록하게 됩니다.

그러나 C++ 에서는 등록이 C#보다는 간단합니다. 그냥 실행 파일 뒤에 -i를 넣으면 등록됩니다.

 

커맨드 창에 들어 가겠습니다.

 

실행이 확인되었습니다.

해제 할때는 파라미터를 -u 넣으면 해제됩니다.

참조 소스입니다.

20121202_blog.zip