NSIS 번외 - 레지스트리

CMD BAT 인스톨 2018. 11. 16. 21:10

튼, 질문 내용을 봅시다.

레지스트리 경로를 설정하고 싶은데... 지우라하셔서 어찌지정하나요!! 예시로 알려쥬세요 ㅠㅠ


레지스트리 경로를 설정하고 싶은데 어떻게 해야하는가... 하는 질문입니다.


여기서 일단 예시 구문을 봅시다. 아래 예시구문은 HM NIS 마법사로 기본설정으로 작성하면 나오는 구문입니다.

솔직히 나온지 12년동안 업데이트가 없는 에디터를 써도 되는건지는 잘 모르겠지만... 달리 선택지도 없습니다. ;ㅅ;

WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\AppMainExe.exe"

티스토리 배경을 검은색으로 지정하는게 아니었는데... 글 배경색이 검은색으로 지정되어 있어서 그런지 생 복붙하기 힘들군요. 여튼...

WriteRegStr은 레지스트리를 작성하는 명령어입니다. WriteRegistryString...의 약자겠지요 뭐.

String은 문자열 형식으로, 말그대로 레지스트리 문자열을 작성하겠다. 이말입니다.

그런데 솔직히 저렇게 놓고 보면 저게 무슨소리인지 감이 안옵니다. 그럴때 필요한게 레퍼런스죠.

레퍼런스는 항상 위대합니다.

http://nsis.sourceforge.net/Reference/WriteRegStr


설명은 이러합니다.

Write a string to the registry. See WriteRegExpandStr for more details.

문자열을 레지스트리에 작성합니다. WriteRegExpandStr 에서 좀더 자세히 볼수 있습니다.

음... 뭐 다 아는 내용이네요. 저 링크는 조금 있다 보도록 합시다.

문법은 이러합니다.

WriteRegStr root_key subkey key_name value

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"

root_key는 이걸 말합니다.

윈도우 버전따라 세부 UI는 다를수도 있겠지만 그부분은 양해 바랍니다.

값은 WriteRegExpandStr 페이지에 따르면

HKCR or HKEY_CLASSES_ROOT

HKLM or HKEY_LOCAL_MACHINE

HKCU or HKEY_CURRENT_USER

HKU or HKEY_USERS

HKCC or HKEY_CURRENT_CONFIG

HKDD or HKEY_DYN_DATA

HKPD or HKEY_PERFORMANCE_DATA

SHCTX or SHELL_CONTEXT

라고 합니다.

예시에서는 HKLM이었으니 HKEY_LOCAL_MACHINE 폴더 안에 작성하겠다는 의미입니다.


subkey 는 루트폴더 안의 어느 경로에 작성할 것인지를 말합니다.

예시에선 "${PRODUCT_DIR_REGKEY}" 라는 값을 사용하고 있는데, 이건 HM NIS 마법사로 생성했다면 문서 상단에 정의됩니다.

!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"

Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe

라고 정의되어있습니다.

요컨데 HKEY_LOCAL_MACHINE 루트폴더 안의 Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe 경로 안에 작성하겠다는 의미입니다.(AppMainExe.exe도 폴더 이름임에 주의합니다.)

Software\Microsoft\Windows\CurrentVersion\App Paths\ 안에는 설치된 어플리케이션(프로그램)들의 실행파일 경로가 저장됩니다. 정확히는 실행파일 경로 레지스트리 정보가 들어있는 폴더가 들어있는거지만요.

key_name은 레지스트리 키의 이름을 지정합니다. 공백이라면(기본값)으로 저장됩니다.

사진의 빨간 네모표시부분에 들어갈 내용을 작성하는겁니다.

(위 사진은 애드가드의 실행파일을 가리키는 레지스트리입니다.)


value는 레지스트리의 데이터 값을 작성합니다.

예시의 경우 "$INSTDIR\AppMainExe.exe" 라고 되어있는데, INSTDIR이 설치경로를 뜻하니 설치경로\AppMainExe.exe 정도가 되겠네요.

즉, 실행파일의 위치를 데이터로 작성하게 됩니다.


중간의 종류 부분은 자동으로 REG_SZ 로 작성됩니다.

언신스톨과 관련된 레지스트리는 Software\Microsoft\Windows\CurrentVersion\의 Uninstall 폴더 안에 있습니다.


실행파일 경로나 지정하고 그만인 App Paths와는 달리, 언인스톨러 레지스트리 폴더 안에는 다양한 레지스트리가 있기 때문에 HM NIS에서 언인스톨러를 사용한다고 했을 때에도

!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"

!define PRODUCT_UNINST_ROOT_KEY "HKLM"

 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\AppMainExe.exe"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

... 같은 여러 레지스트리를 작성합니다. 각각의 내용중 제일 중요한것은

DisplayName은 프로그램 추가/제거 리스트에 보일 이름

UninstallString은 언인스톨러 경로 지정

정도.. 입니다. 나머지 정보도 없으면 곤란하긴 하지만요.


레지스트를 삭제할때는 DeleteRegKey 명령어를 사용합니다.

DeleteRegKey root_key subkey

DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"

DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"

이런식으로 씁니다.

루트키와 서브키 만으로 이루어져 있으며, 서프키가 가리키는 대상 폴더 자체를 삭제해버립니다.

덕분에 저 수많은 언인스톨 레지스트리를 하나씩 삭제하는 수고를 덜수 있지요.



일단 레지스트리의 작성과 삭제에 대한 내용은 여기서 마칩니다.

혹 문자열 형 외의 데이터형으로 작성하고 싶다면

32비트 정수형 데이터 작성용 WriteRegDWORD

바이너리형 데이터 작성용 WriteRegBin


문자열이지만 종류를 REG_EXPAND_SZ1 2로 작성하고 싶을때 쓰는 WriteRegExpandStr

가 있습니다.

이 명령어들은 써넣을 값의 형태가 정수인지 바이너리니 하는 식의 차이일뿐, 사용법은 전부 동일합니다.



ReadRegStr $0 HKCR "AppID\{AGDGD-4504-JJSK-JSIE-HDGD84747}" "instl"
${If} ${Errors}
StrCpy $instplugin yes
${Else}
StrCpy $instplugin no
${EndIf}