[MFC] 서비스 프로그램

개발 노트/C 언어  2012.12.02 23:05



안녕하세요. 개발자 명월입니다.

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

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

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

 

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

 

 

 

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

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

 

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

 

 

 

 

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

 

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

 

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

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

 

 

 

소스를 추가하였습니다.

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

 

밑에

 

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

 

를 선언하겠습니다.

 

 

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

 

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

 

 

 

  1 // 20121202_blog.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
  2 //
  3
  4 #include "stdafx.h"
  5 #include "Service.h"
  6 #include "20121202_blog.h"
  7
  8 #ifdef _DEBUG
  9 #define new DEBUG_NEW
10 #endif
11
12 using namespace std;
13
14 UINT MTServerThread(LPVOID pParam);
15 class CUpdateService: public CService{
16 public :
17 CWinThread *_thread;
18 void main(void){
19 CService::Begin(_T("명월서비스"));
20 CService::End();
21 }
22 protected :
23 void OnStarted(){
24 _thread = AfxBeginThread(MTServerThread,0);
25 }
26 void OnStopped(){
27 DWORD dwExitCode;
28 GetExitCodeThread(_thread->m_hThread,&dwExitCode);
29 WSACleanup();
30 }
31 };
32 UINT MTServerThread(LPVOID pParam){
33 return 0;
34 }
35
36 // 유일한 응용 프로그램 개체입니다.
37
38 CWinApp theApp;
39
40 using namespace std;
41
42 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
43 {
44 int nRetCode = 0;
45
46 HMODULE hModule = ::GetModuleHandle(NULL);
47
48 if (hModule != NULL)
49 {
50 // MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
51 if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
52 {
53 // TODO: 오류 코드를 필요에 따라 수정합니다.
54 _tprintf(_T("심각한 오류: MFC를 초기화하지 못했습니다.\n"));
55 nRetCode = 1;
56 }
57 else
58 {
59 // TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
60 CUpdateService upServ;
61 if(argc == 2){
62 if(_tcscmp(argv[1],_T("-i")) == 0){
63 upServ.Install(_T("명월서비스"));
64 }
65 else if(_tcscmp(argv[1],_T("-u")) == 0){
66 upServ.Uninstall(_T("명월서비스"));
67 }
68 return true;
69 }
70 upServ.main();
71 }
72 }
73 else
74 {
75 // TODO: 오류 코드를 필요에 따라 수정합니다.
76 _tprintf(_T("심각한 오류: GetModuleHandle 실패\n"));
77 nRetCode = 1;
78 }
79
80 return nRetCode;
81 }
82

 


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

이제 등록해 보겠습니다.

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

그러나 C++ 에서는 등록이 C#보다는 간단합니다 그냥 실행하고 뒤에 -i를 붙여주면 등록이 완료가 됩니다.

 

커맨드 창에 들어가보도록 하겠습니다.

 

 

 

 

실행이 확인 되었습니다.

해제 할때는 -u 를 누르면 해제가 됩니다.

 

 

참조 소스입니다.

 

20121202_blog.zip


댓글 4개가 달렸습니다.
댓글쓰기
  1. Yenos
    2012.12.14 09:53 신고 |  수정/삭제  댓글쓰기

    우와,, 소스 까지 ..
    MFC도 이제 손좀 대볼까나.. ㅋㅋㅋㅋㅋㅋ
    좋은 정보 감사합니다!

    • 明月 v명월v
      2013.02.07 01:02 신고 |  수정/삭제

      방문 감사합니다.
      MFC 소스를 많이 올리고 싶은데 개인적으로 요즘 C#이 너무 재미있어서 C언어 소스를 못올리고 있네요..
      빨리 정리해서 C언어 항목도 채울께요.

  2. 감사드립니다.
    2013.10.29 12:07 신고 |  수정/삭제  댓글쓰기

    많은 도움이 되었습니다.
    좋은 자료 감사드립니다.

    • 明月 v명월v
      2013.10.30 01:19 신고 |  수정/삭제

      블로그 방문 감사드립니다...
      MFC 자료가 부족해서 항상 채워야지 채워야지 하면서 자료가 아직 턱없이 적네요...^^