Visual Studio를 실행하고 "Empty Project"를 선택하고 Next를 누릅니다.
프로젝트 이름을 입력하고 Create를 누릅니다.
소스코드가 하나도 없는 비어있는(empty) 프로젝트입니다. 여기에 소스코드파일을 추가합니다.
"Solution Explorer"창의 "Source Files"에 마우스 오른쪽 버튼을 클릭하고 "Add" -> "New Item..."을 선택합니다.
추가하는 파일의 이름은 "main.cpp"로 하겠습니다. 입력하고 "Add"를 클릭합니다.
다음의 소스코드를 입력합니다. 소스코드의 간결성을 위해 에러처리코드는 포함하고 있지 않습니다.
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#define SVCNAME TEXT("SvcName")
void SvcInstall(void)
{
SC_HANDLE schSCManager, schService;
TCHAR tszPath[MAX_PATH];
GetModuleFileName(NULL, tszPath, MAX_PATH);
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
schService = CreateService(schSCManager, SVCNAME, SVCNAME, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
tszPath, NULL, NULL, NULL, NULL, NULL);
_tprintf(_T("Service installed\n"));
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
void SvcDelete(void)
{
SC_HANDLE schSCManager, schService;
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
schService = OpenService(schSCManager, SVCNAME, DELETE);
DeleteService(schService);
_tprintf(_T("Service uninstalled\n"));
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
int __cdecl _tmain(int argc, TCHAR* argv[])
{
if (_tcscmp(TEXT("install"), argv[1]) == 0)
SvcInstall();
else if (_tcscmp(TEXT("delete"), argv[1]) == 0)
SvcDelete();
}
솔루션을 빌드한 후 관리자권한으로 "cmd"창을 열고 다음과 같이 실행합니다.
다음 그림과 같이 services.msc를 실행합니다.
서비스목록 중에 설치된 "SvcName"을 확인할 수 있습니다.
이제 관리자권한으로 "cmd"창을 열고 다음과 같이 실행합니다.
다시 서비스 목록을 확인하면 설치되었던 서비스가 삭제되었음을 확인할 수 있습니다.
혹시 확인이 안된다면 리스트에서 우클릭을 하여 '새로 고침'을 선택하거나 F5를 눌러서 확인해보시기 바랍니다.
용어
- SCM : Service Control Manager
참고자료
https://docs.microsoft.com/en-us/windows/win32/services/the-complete-service-sample
The Complete Service Sample - Win32 apps
Learn more about: The Complete Service Sample
docs.microsoft.com
'Windows' 카테고리의 다른 글
visual studio 2022 언어 설정 (0) | 2022.03.05 |
---|---|
관리자 권한으로 cmd창 실행하기 (0) | 2022.03.04 |
GetLastError 문자열로 출력하기 (0) | 2022.02.25 |
Windows Application FindProcessId C/C++ Code (0) | 2022.02.25 |
배치스크립트 파일읽기 (0) | 2022.02.25 |