본문 바로가기
C++, MFC

[MFC] 프로그램 내부에서 다른 프로그램(exe, msi) 설치하는 방법 / exe, msi 설치 옵션

by dev_drive 2022. 9. 29.
반응형

간혹 초기 세팅 또는 프로그램 업데이트를 위해 다른 프로그램의 설치가 필요한 경우가 있습니다. 

 

외부 프로그램을 실행할 때 사용하는 ShellExecute의 확장형인 ShellExecuteEx를 활용해서 구현하는 방법에 대해 설명해 드리겠습니다. 

 

exe와 msi가 조금 방법이 달라서 나눠서 설명하겠습니다.

 


exe 파일 설치

 

SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(SHELLEXECUTEINFO));
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.fMask = SEE_MASK_NOCLOSEPROCESS;
si.lpVerb = _T("runas");
si.lpFile = _T("exe경로");
si.lpParameters = _T(" /S");
si.nShow = SW_SHOW;
BOOL bRet = ShellExecuteEx(&si);
if (bRet && si.hProcess != NULL)
{
	WaitForSingleObject(si.hProcess, INFINITE);
	CloseHandle(si.hProcess);
}

 

* fMask의 SEE_MASK_NOCLOSEPROCESS는 프로세스의 핸들을 hProcess로 받기 위한 설정입니다.  필요없다면 SEE_MASK_DEFAULT로 설정해도 됩니다.

 

* lpVerb의 runas는 관리자권한에 대한 설정입니다.  프로그램 설치는 대부분 관리자 권한을 필요로하므로 runas로 설정해줍니다. 

 

* lpParameters의 /S는 Silent모드 입니다.  설치할 때 경로, 옵션 설정 등의 UI 없이 백그라운드에서 설치하는 방법입니다.  (Silent모드로 하더라도 사용자에게 관리자권한을 요청하는 메세지는 발생합니다)

 

* WaitForSingleObject는 설치가 끝날 때까지 대기하기 위함입니다.  대기가 필요없다면 호출하지 않아도 됩니다. 

 

 

🔽 SHELLEXECUTEINFO에 대한 자세한 내용은 아래 MSDN을 참고해주세요

 

SHELLEXECUTEINFOA (shellapi.h) - Win32 apps

Contains information used by ShellExecuteEx. (ANSI)

learn.microsoft.com

 

🔽 설치파일마다 옵션이 조금씩 다른데 아래 링크에 다양한 형식에 대한 옵션들이 나와있으니 참고해주세요

 

How to Silently Install EXE and MSI setup applications (Unattended)

This article is a complete guide about silent installation. Find out what is a silent install and how to silently install MSI and exe setups (the unattended way).

www.advancedinstaller.com

 

 

 

msi 파일 설치

 

SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(SHELLEXECUTEINFO));
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.fMask = SEE_MASK_NOCLOSEPROCESS;
si.lpVerb = _T("runas");
si.lpFile = _T("msiexec.exe");
si.lpParameters = _T(" /i msi경로 /quiet");
si.nShow = SW_SHOW;
BOOL bRet = ShellExecuteEx(&si);
if (bRet && si.hProcess != NULL)
{
	WaitForSingleObject(si.hProcess, INFINITE);
	CloseHandle(si.hProcess);
}

 

* lpFile의 msiexec.exe는 Windows Installer(msi) 관련 툴입니다. 

 

* lpParameters의 /i는 설치 옵션이고 /quiet는 Silent모드와 동일하며 UI없이 백그라운드에서 설치하는 방법입니다.

(만약 설치 시간이 오래걸리는 프로그램이라면 진행률이 표시되는 /passive 모드를 사용해보세요)

 

 

 

🔽 msiexec 옵션에 대한 내용은 아래를 참고해주세요

msiexec /Option <필수 매개 변수> [선택적 매개 변수]

설치 옵션
 </package | /i> <Product.msi>
 제품을 설치 또는 구성합니다.
 /a <Product.msi>
 관리 설치 - 네트워크에서 제품을 설치합니다.
 /j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]
 제품을 보급합니다. m - 모든 사용자, u - 현재 사용자
 </uninstall | /x> <Product.msi | ProductCode>
 제품을 제거합니다.
표시 옵션
 /quiet
 자동 모드, 사용자 작업이 필요 없습니다.
 /passive
 무인 모드 - 진행률 표시줄만 표시합니다.
 /q[n|b|r|f]
 사용자 인터페이스 수준을 설정합니다.
 n - UI 표시 안 함
 b - 기본 UI만 표시
 r - 간단한 UI만 표시
 f - 전체 UI 표시(기본값)
 /help
 도움말 정보
다시 시작 옵션
 /norestart
 설치 완료 후 다시 시작하지 않습니다.
 /promptrestart
 필요한 경우 사용자에게 다시 시작 여부를 묻습니다.
 /forcerestart
 설치 후 컴퓨터를 항상 다시 시작합니다.
로깅 옵션
 /l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <로그 파일>
 i - 상태 메시지
 w - 치명적이지 않은 경고
 e - 모든 오류 메시지
 a - 작업 시작
 r - 작업 관련 기록
 u - 사용자 요청
 c - 초기 UI 매개 변수
 m - 메모리 부족 또는 치명적인 종료 정보
 o - 디스크 공간 부족 메시지
 p - 터미널 속성
 v - 자세한 정보 출력
 x - 추가 디버깅 정보
 + - 기존 로그 파일에 추가
 ! - 로그의 각 줄 플러시
 * - v 및 x 옵션을 제외한 모든 정보 기록
 /log <LogFile>
 /l* <로그 파일>과 동일
업데이트 옵션
 /update <Update1.msp>[;Update2.msp]
 업데이트를 적용합니다.
 /uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>
 제품에 대한 업데이트를 제거합니다.
복구 옵션
 /f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>
 제품을 복구합니다.
 p - 파일이 없는 경우에만
 o - 파일이 없거나 이전 버전이 설치되어 있는 경우(기본값)
 e - 파일이 없거나 이전 또는 같은 버전이 설치되어 있는 경우
 d - 파일이 없거나 다른 버전이 설치되어 있는 경우
 c - 파일이 없거나 체크섬이 계산된 값과 다를 경우
 a - 모든 파일을 강제로 다시 설치
 u - 필요한 모든 사용자 특정 레지스트리 항목(기본값)
 m - 필요한 모든 컴퓨터 특정 레지스트리 항목(기본값)
 s - 기존의 모든 바로 가기(기본값)
 v - 원본에서 실행하여 로컬 패키지에 연결
공개 속성 설정
 [PROPERTY=PropertyValue]

 

반응형

댓글