본문 바로가기

Programming/Windows Visual C++

윈도우 서비란 무엇인가? 서비스 만들기

  • 서비스란 무엇인가?
    • 윈도우 기동 과정: 부팅 > 드라이버 로딩 > 서비스 로딩 > 로그온 > 응용 프로그램 로딩
    • 위에서 보듯 사용자 로그온 전에 서비스가 먼저 로딩된다.
    • 서비스는 일반적으로 Local System Account로 구동되기 때문에 시스템을 제어하는데 강력한 권한을 가진다. 일반 사용자 계정으로 구동도 가능한데 service.msc에 들어가 서비스 속성의 Log On탭에서 바꿔줄 수 있다.(혹은 .exe프로그램 코딩할 때 WINAPI CreateService() 함수의 인자를 이용해서 바꿔줄 수 있다.)
    • 서비스는 시스템 경로에 파일 읽기/쓰기, 로컬 시스템 레지스트리 엑세스와 같은 모든 작업을 할 수 있는 권한이 있고 UAC에 영향을 받지 않고 돌아가는 장점을 가진다.
    • 서비스 또한 근본적으로는 하나의 .exe프로그램이 돌아가는 것이다. service.msc에 들어가서 서비스 속성을 눌러보면 '실행파일경로'에 그 서비스의 본 프로그램이 어디에 위치해있는지 보여준다.
    • 서비스 속성상 먼저 실행되어야 하는 서비스들이 있는데 이것도 WINAPI CreateService()함수에서 지정해줄 수 있다.(dependency라고 하지)
    • 서비스는 GUI를 가질 수 없다. 별도 프로그램을 만들어서 연동 정도는 IPC를 통해 가능하다.
  • 윈도우 서비스 프로그램을 만들려면 부서에서 사용하는 service.cpp service.h를 이용해야한다. 그런데 이걸 이용하려면 MFC라이브러리가 필요하다.
  • UI가 없는 상태로 MFC라이브러리를 사용하려면 File>new>project > Visual C++ > Windows Desktop > Windows Desktop Wizard를 선택해서 console application을 선택하고 MFC라이브러리를 Add하도록 체크해주면 된다.
  • 다만 service.cpp와 service.h를 추가해서 프로세스 starting point를 main()이 아닌 winmain()으로 바꾸는 경우 'libcmt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _main' 에러가 발생하는데 이 때는 아래와 같이 설정을 바꿔서 문제를 해결해줘야 한다.
    • 해결:
      • 프로젝트 속성 > C/C++ > 전처리기 > 전처리기 정의: 여기에 보면 아마 _CONSOLE이라고 되어있을텐데 이걸 _WINDOWS로 바꿔줘야한다.
      • 또한 프로젝트 속성 > 링커 > 시스템: 여기에 console로 되어있는것을 Windows로 바꿔줘야함.
      • 그 다음 컴파일 하면 잘 됨.
      • 프로젝트 만들 때 windows console이나 windows application을 선택해서 해봤으나 잘 안된다.