[MFC] 종료 시 자신을 삭제하는 프로그램을 만드는 방법

[MFC] 종료 시 자신을 삭제하는 프로그램을 만드는 방법

기획팀에서 1회만 실행되는(종료되면 삭제되는) 프로그램을 만들어 달란 요청이 간간히 들어옵니다.
그때마다 어떻게 했더라 매일 검색하고 찾는 나 자신을 보면서 기록합니다.

이번 글에서는 프로그램 종료 시 자기 자신을 삭제하는 프로그램을 만드는 방법에 대해 알아보겠습니다.
파일을 삭제하는 API 함수는 있으나, 윈도우에서는 실행 중인 프로그램(자기 자신)의 .exe파일을 삭제 할 수 없으므로,
.exe 삭제를 batch 파일에서 해줘야 합니다.

아래는 MFCApplication1.exe에서 batch 파일을 만들고, 삭제 스크립트를 batch 파일에 입력, batch 실행하는 코드입니다.

void CMFCApplication1Dlg::MakeSelfKillBatch()
{
	// 현재 실행하는 프로그램 경로
	TCHAR tzFullPathName[MAX_PATH] = {0,};
	::GetModuleFileName((HMODULE)&__ImageBase, tzFullPathName, sizeof(tzFullPathName));
	CString strDelFilePathName;
	strDelFilePathName.Format(_T("%s"), tzFullPathName);
	CString strDelFileName = PathFindFileName(strDelFilePathName);
	CString strDelFilePath = strDelFilePathName;
	strDelFilePath.Replace(strDelFileName, _T(""));

	// batch 파일
	CString strKillerName(_T("killfile.bat"));
	CString strKillerPathName;
	strKillerPathName.Format(_T("%s%s"), strDelFilePath, strKillerName);

	// batch 파일 생성
	BOOL bOpen = m_file.Open(strKillerPathName, CStdioFile::modeCreate | CStdioFile::typeText | CStdioFile::modeReadWrite | CStdioFile::shareExclusive);
	if (bOpen)
	{
		// batch파일 내용 작성
		CString strBatFileText(_T(""));
		strBatFileText.Format(_T(":Repeat\r\ndel /f /s /q %s\r\nif exist \"%s\" goto Repeat\r\ndel /s /q %s\r\n"),
							  strDelFilePathName, strDelFilePathName, strKillerPathName);
		m_file.WriteString(strBatFileText);
		//m_file.Flush();
		m_file.Close();
	}

	// batch 파일을 실행
	HINSTANCE hIns = ShellExecute(NULL, _T("open"), strKillerPathName, NULL, NULL, 0);
}

void CMFCApplication1Dlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
	MakeSelfKillBatch(); // 종료될 때 호출
}

위 코드를 실행 했을 때 생성되는 batch 파일 스크립트는 아래와 같습니다.

:Repeat

del /f /s /q D:\ect\study\MFC\SelfKill\MFCApplication1\Debug\MFCApplication1.exe

if exist "D:\ect\study\MFC\SelfKill\MFCApplication1\Debug\MFCApplication1.exe" goto Repeat

del /s /q D:\ect\study\MFC\SelfKill\MFCApplication1\Debug\killfile.bat

스크립트를 해석하면 아래와 같습니다.

  1. MFCApplication1.exe를 삭제
  2. MFCApplication1.exe가 존재하면 Repeat으로 이동.(다시 1번 수행)
    존재하지 않으면 다음 작업 수행
  3. killfile.bat 파일 삭제

아래처럼 동작하는 것을 볼 수 있습니다.