본문으로 바로가기

[NSIS] VC++ 버전체크 및 설치

category 유틸리티/NSIS 2016. 6. 28. 15:25

NSIS를 통해 설치하고자 하는 프로그램에 따라 Visual C++ 라이브러리를 필요로 한다.

제어판의 프로그램 추가/제거 부분에서 해당 라이브러리가 설치되어 있는지 확인할 수 있지만, NSIS를 통해 설치 프로그램을 만들고 있고 VC++의 버전을 체크하여 사용자의 PC 환경에 설치되어 있지 않을 경우 설치해 드리기 위한 방법이다.

재배포 패키지 설치 유무 확인

Visual C++를 사용하여 개발된 응용 프로그램을 설치할 경우 Visual C++ 프로그램이 설치되어 있지 않은 컴퓨터에서 실행하기 위해 해당 Visual C++ 라이브러리의 런타임 구성 요소가 설치되어 있는지 확인해야 한다.

일반적으로 레지스트리에서 추가/제거 목록을 확인할 수 있다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}

버전에 따른 ProductCode를 체크하는 방법으로 설치 유무를 판단하는 것이다. (다음의 예시는 NSIS로 VC++ 2008 Redistributables 체크하고 설치하는 코드이다.)

;----------------------------------------------------------
; Visual C++ 2008 Redistributable 9.0.30729.6161 설치
; 해당 버전에 따라 아래 내용이 바뀌며 다른 버전 설치 시 ReadRegDword의 주소를 변경해 주어야 한다.
; Function .onInstSuccess란 실제 설치 파일들이 압축이 풀리면 실행해 준다.
;----------------------------------------------------------

Function .onInstSuccess
  Call CheckVCRedist
    Pop $R9
    StrCmp $R9 "No" 0 +3
    MessageBox MB_OK|MB_ICONSTOP "프로그램 실행을 위해 Visual C++ 2008 Redistributable를 설치합니다."
    ExecWait "$INSTDIR\vcredist_x86.exe"
FunctionEnd
Function CheckVCRedist
  Push $R9
  ClearErrors
  ReadRegDword $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9BE518E6-ECC6-35A9-88E4-87755C07200F}" "Version"
  ; if VS 2005+ redist SP1 not installed, install it
  IfErrors 0 VSRedistInstalled
    StrCpy $R9 "No"
  VSRedistInstalled:
    Exch $R9
FunctionEnd
만약 Visual C++ 2008 라이브러리가 설치되어 있지 않다면 "프로그램 실행을 위해 Visual C++ 2008 Redistributable를 설치합니다."라는 메시지 박스를 띄운 뒤 사용자가 OK(승인)하면, ExexWait 명령에 의해 설치 디렉터리의 vcredist_x86.exe를 실행하여 VC++ 라이브러리를 설치하게 된다.
[중요] 레지스트리 주소와 관련하여... (2018.08.23 추가 내용)

참고로 위의 스크립트는 WIndows XP 시절에 작성했던 것이다. 만약 Windows 7 환경 이상이라면 (아마도...) 위 스크립트의 17번째 라인의 레지스트리 경로가 다르다는 것이다.

버전별 주소는 다음의 링크의 답변을 참고하면 된다.

재배포 패키지 버전별 ProductCode

참고로 아래 코드는 영문버전 기준이고, 한글버전의 경우 다를 수 있다...고 한다.

Visual C++ 2005 (8.0)

Visual C++ 2005 runtime

Visual C++ 2005 SP1 runtime

Visual C++ 2008 (9.0)

Visual C++ 2008 runtime

Visual C++ 2008 SP1 runtime

Visual C++ 2010 (10.0)

Visual C++ 2010 runtime

Visual C++ 2010 SP1 runtime