NSIS로 셋업프로그램을 개발하다보면 설치된 정보를 기록하고 싶을때가 있다.

물론 여러방법이 있겠지만

가장 정확한것은 인터넷이 연결되어 있다고 가정했을때 DB로 정보를 보내주면

객관적인 기록을 남길 수 있다.

 

이때 이용하는 플러그인이 MSSQL_OLEDB 플러그인이다

아래 주소에 가서 다운받으면 된다.

 

http://nsis.sourceforge.net/MSSQL_OLEDB_plug-in

 

사용법은 다운받은 예제에 포함되어 있지만 잠깐 살펴보기로 하자

 

!include "MUI.nsh"
!include "name2ip.nsh"

!include "OLEDB.NSH"

 

  ;-----------------------------------------------------------------------------------------------------------------------
  ;##### DB에 설치 정보 입력하기
  ;-----------------------------------------------------------------------------------------------------------------------
  IpConfig::GetEnabledNetworkAdaptersIDs
  Pop $0
  Pop $0
  StrCpy $2 0
  StrCpy $4 0
  ClearErrors
  ${Do}
    StrCpy $3 $0
    ${WordFind} "$0" " " "+1{" $R0
    IpConfig::GetNetworkAdapterDescription $R0
    Pop $1
    Pop $1
    ${If} $2 == 0
      StrCpy $2 $1
      StrCpy $4 $R0
    ${EndIf}
    ${WordReplace} "$0" "$R0 " "" "E+1" $0
  ${LoopUntil} ${Errors}
  ClearErrors
  Pop $1
  IpConfig::GetNetworkAdapterMACAddress $4
  Pop $1
  Pop $MACAddress  ;맥주소를 얻어온다

 

  ${name2ip::FindFirstIP} "" $0  ;IP주소를 얻어온다(공인IP를 얻어오는 것은 좀더 찾아보세요

 

; DB입력부분

  ${OLEDB}::SQL_Logon   "IP주소" "아이디" "비밀번호"
  ${OLEDB}::SQL_Execute   " use DB명"
  ${OLEDB}::SQL_Execute   " Insert into 테이블명(구분,제품아이디, 솔루션명, 버전, 설치일, 맥주소, IP주소) Values ('설치/삭제', '고유번호','솔루션명','v1.0', getdate(),'$MACAddress','$0')"
  ${OLEDB}::SQL_Logout

 

상기와 같이 처리하면 될것 같다.

 

일단 제품아이디는 개발자가 직접 정의를 하면 될것 같고

고유아이디인 맥주소를 찾고 IP를 찾아서 설치일자와 함께 입력을 요청하면

DB에 로그가 쌓인다

거기서 정보를 가져오면 될것 같다...

도움이 되시길....

 

'개발팁( NSIS)' 카테고리의 다른 글

NSIS로 셋업프로그램 만들기  (1) 2013.07.18
top


개발을 하다보면 셋업프로그램을 만들어야 하는 경우가 발생합니다.

또한 업데이트에 대한 고민도 해야 합니다.

 

그중 하나인 셋업에 대한 부분 중 제가 만든 것을 약간 정리해봤습니다

 

도움이 되었으면 합니다

 

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
;-----------------------------------------------------------------------------------------------------------------------
;##### 제품 이름, 버전, 업데이트 버전, 레지스트리 등록이름, 업체명, 업체 URL, 업체 홈페이지 표시 이름, 런타임 명
;-----------------------------------------------------------------------------------------------------------------------
!define PRODUCT_NAME "제품명"    ;예)블럭노리
!define PRODUCT_VERSION "버전정보"  ;예) 1.0
!define APP_AUTORUN_REGNAME "레지스트리 등록이름"    ; 시스템 시작시 자동 시작 레지스트리 이름
!define PRODUCT_PUBLISHER "제작사"   ;예) New & Now Inc.
!define PRODUCT_WEB_SITE "웹사이트 주소" ;예) http://www.newnnow.co.kr
!define HOMEPAGE_NAME "바탕화면 홈페이지 단축아이콘 명"  ;예)New & Now 홈페이지
!define RUNTIME_VERSION "Adobe AIR"

;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 완료 후 실행파일명
;-----------------------------------------------------------------------------------------------------------------------
!define APP_EXENAME "실행파일명" ;예) 어플최초 실행명  Blocknori.exe

;-----------------------------------------------------------------------------------------------------------------------
;##### 레지스트리 등록을 위한 정보
;-----------------------------------------------------------------------------------------------------------------------
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_EXENAME}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_AUTORUN_REGNAME}"
!define PRODUCT_PASSDIR_REGKEY "Software\${APP_AUTORUN_REGNAME}"
!define PRODUCT_UNINST_RUNTIME "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RUNTIME_VERSION}"
!define COMMON_REGKEY "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
;-----------------------------------------------------------------------------------------------------------------------
;##### MUI 1.67 compatible
;-----------------------------------------------------------------------------------------------------------------------
!include "MUI.nsh"
!include "sections.nsh"
!include "Library.nsh"
!include "MUI2.nsh"
!include "OLEDB.NSH"
!include "LogicLib.nsh"
!include "WordFunc.nsh"

;-----------------------------------------------------------------------------------------------------------------------
;##### MUI Settings
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_ABORTWARNING
!define MUI_ICON ".\icon\install.ico"  ;설치아이콘
!define MUI_UNICON ".\icon\uninstall.ico" ;삭제아이콘

;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 환영 메세지
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_WELCOMEFINISHPAGE_BITMAP ".\images\welcome.bmp" ;환영 페이지의 배경(190*290)
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH ;환영 페이지의 배경을 늘리지 않음
!define MUI_WELCOMEPAGE_TITLE "새로운 디자인과 기능으로 업그레이드된\r\n블럭노리 설치를 시작합니다."
!define MUI_WELCOMEPAGE_TEXT "아래 [다음] 버튼을 누르시면 설치가 시작됩니다."


;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 헤더 메세지
;-----------------------------------------------------------------------------------------------------------------------
;!define MUI_HEADERIMAGE
;!define MUI_HEADERIMAGE_BITMAP ".\head.bmp" ; 헤드이미지(150*57)
;!define MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_PAGE_HEADER_TEXT " 블럭노리 사용자 이용약관"
!define MUI_PAGE_HEADER_SUBTEXT "- 블럭노리을 설치하시기 전에 사용자 이용약관 내용을 살펴보시기 바랍니다."

;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 약관 메세지
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_LICENSEPAGE_TEXT_TOP "블럭노리 사용자 이용약관 동의 사항의 나머지 부분을 보시려면 [Page Down] 키를 눌러주세요." ;
!define MUI_LICENSEPAGE_TEXT_BOTTOM "내용에 동의하셨다면 '동의함'을 눌러주세요. 블럭노리을 설치하기 위해서는 반드시 내용에 동의하셔야 합니다."
!define MUI_TEXT_COMPONENTS_TITLE " 블럭노리 설치 구성 요소 선택"
!define MUI_TEXT_COMPONENTS_SUBTITLE "- 설치하고자 하는 블럭노리을의 구성 요소를 선택해 주세요."
!define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE " "
!define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO " "
!define MUI_TEXT_INSTALLING_TITLE " 블럭노리 설치중"
!define MUI_TEXT_INSTALLING_SUBTITLE "- 블럭노리을 설치하는 동안 잠시 기다려 주세요."

;-----------------------------------------------------------------------------------------------------------------------
;##### Instfiles page
;-----------------------------------------------------------------------------------------------------------------------
!insertmacro MUI_PAGE_WELCOME ;환영 페이지
!insertmacro MUI_PAGE_LICENSE ".\license\License.rtf" ;라이센스 페이지
!insertmacro MUI_PAGE_COMPONENTS
;Page components
!insertmacro MUI_PAGE_INSTFILES

;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 완료후 보여질 페이지
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_EXENAME}"
!define MUI_FINISHPAGE_TITLE "블럭노리 설치 완료."
!define MUI_FINISHPAGE_TEXT "블럭노리을 설치해주셔서 감사합니다."
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_INSTFILES

;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 언어
;-----------------------------------------------------------------------------------------------------------------------
!insertmacro MUI_LANGUAGE "Korean"

;-----------------------------------------------------------------------------------------------------------------------
;##### 관리자 권한 획득
;-----------------------------------------------------------------------------------------------------------------------
RequestExecutionLevel admin

;-----------------------------------------------------------------------------------------------------------------------
;##### 제품명, 실행파일 생성위치, 인스톨 위치 지정
;-----------------------------------------------------------------------------------------------------------------------
Name "${PRODUCT_NAME}"
OutFile "..\Setup\$제품명_Setup.exe"
InstallDir "$LOCALAPPDATA\${PRODUCT_NAME}"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "passdir"
ShowInstDetails show
ShowUnInstDetails show

;-----------------------------------------------------------------------------------------------------------------------
;##### 전역 변수 선언
;-----------------------------------------------------------------------------------------------------------------------
Var VER
var MACAddress

;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 프로그램이 나타나기 전에 수행할 함수
;-----------------------------------------------------------------------------------------------------------------------
Function .onInit
  #인터넷 연결 유무 체크
  Pop $1
  System::Call 'wininet.dll::InternetGetConnectedState(*i .r0, i 0) i.r1'
  StrCmp "$1" "1" inetA
  StrCmp "$1" "0" inetB
  goto chkend

  inetA:
  
    Pop $6
    ReadRegStr "$6" HKLM "${PRODUCT_UNINST_RUNTIME}" "VersionMajor" ; Adobe Air 버전 비교
    StrCmp "$6" "2" skipA skipB
    goto tend

    ;-----------------------------------------------------------------------------------------------------------------------
    ;##### 인터넷을 통하여 런타임 다운로드 후 설치함
    ;-----------------------------------------------------------------------------------------------------------------------
    skipA:
      goto tend
    skipB:
      MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "프로그램 설치를 위해서 Adobe Air v2.0 이상이 반드시 설치되어야만 합니다.$\n$\nAdobe Air를 설치하시겠습니까?" IDYES +3
      MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "설치가 종료되었습니다."
      Abort
      SetOutPath "$INSTDIR"
      InetLoad::load /POPUP "Adobe Air 다운로드중" "http://airdownload.adobe.com/air/win/download/latest/AdobeAIRInstaller.exe" "AdobeAIRInstaller.exe"
      Pop $0 # return value = exit code, "OK" if OK
      StrCmp "$0" "OK" setupA
      MessageBox MB_OK|MB_ICONEXCLAMATION "Adobe Air다운로드에 실패했습니다. 설치를 중단합니다." /SD IDOK
      Abort
      setupA:
        ExecWait "$INSTDIR\AdobeAIRInstaller.exe"
        Delete "$INSTDIR\AdobeAIRInstaller.exe"
       
        SetAutoClose true

        RMDir /r "$INSTDIR"

      goto tend
    tend:
      Push $6

    ReadRegStr "$6" HKLM "${PRODUCT_UNINST_RUNTIME}" "DisplayName" ; 기존버전 설치유뮤 확인
    StrCmp "$6" "${RUNTIME_VERSION}" skipC
    StrCmp "$6" "" skipD
    goto send

    skipC:
        Pop $5
        ## 기존 버전이 있는지 확인
        ReadRegStr "$5" HKLM "${PRODUCT_UNINST_KEY}" "DisplayVersion"
        StrCmp "$5" "${PRODUCT_VERSION}" initA
        StrCmp "$5" "" "0" initB
        StrCpy "$VER" "0"
        Goto send

        initA:
          MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "$(^Name) 가(이) 이미 설치되었습니다.$\n$\n설치가 종료됩니다."
          Abort
          Goto end
        initB:
          StrCpy "$VER" "1"
          Goto end
        end:
          Push $5
          Push $VER
         
        goto send
    skipD:
      MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "프로그램 설치를 위해서 Adobe Air가 반드시 설치되어야만 합니다.$\n$\nAdobe Air를 설치 후 다시 시도해주세요.$\n$\n설치가 종료됩니다."
      Abort
     goto send
    send:
     Push $6
     goto chkend

  inetB:
    MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "인터넷이 연결되어 있지 않습니다..$\n$\n인터넷 연결 후 다시 시도해주세요.$\n$\n설치가 종료됩니다."
    Abort
    goto chkend
  chkend:
    Push $1

FunctionEnd

;설치실패시
Function .onInstFailed
  ;-----------------------------------------------------------------------------------------------------------------------
  ;##### 실행중인 프로그램이 있으면 강제 종료
  ;-----------------------------------------------------------------------------------------------------------------------
  FindProcDLL::FindProc "${APP_EXENAME}"
  StrCmp $R0 1 mfound notmfound

  mfound:
    KillProcDLL::KillProc "${APP_EXENAME}"
  notmfound:


  Delete "$INSTDIR\*.*"
  RMDir /r "$INSTDIR"
 
  ~ ~ ~ ~ ~ ~ ~

  SetAutoClose true
FunctionEnd

;-----------------------------------------------------------------------------------------------------------------------
;##### 파일 복사 및 레지스트리 등록, 아이콘 생성
;-----------------------------------------------------------------------------------------------------------------------
Section "블럭노리 설치" SEC01
  ;-----------------------------------------------------------------------------------------------------------------------
  ;##### 실행중인 프로그램이 있으면 강제 종료
  ;-----------------------------------------------------------------------------------------------------------------------
  FindProcDLL::FindProc "${APP_EXENAME}"
  StrCmp $R0 1 mfound notmfound

  mfound:
    KillProcDLL::KillProc "${APP_EXENAME}"
  notmfound:

 
  SectionIn RO ; 필수설치표시
 
  ;-----------------------------------------------------------------------------------------------------------------------
  ;##### 파일 복사
  ;-----------------------------------------------------------------------------------------------------------------------
  SetOutPath "$INSTDIR"
  File "..\source\*.*"

~ ~ ~ ~ ~ ~ ~
  ndllfound:
 
  ;-----------------------------------------------------------------------------------------------------------------------
  ;##### 설치후 실행파일 실행
  ;-----------------------------------------------------------------------------------------------------------------------
;  Exec "$INSTDIR\${APP_EXENAME}"
  SetAutoClose true
SectionEnd

; Optional section (can be disabled by the user)
;Section "컴퓨터 시작시 자동실행"
;  CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "unvisible" "$INSTDIR\${APP_EXENAME}" 0
;  WriteRegStr HKCU  "Software\Microsoft\Windows\CurrentVersion\Run" "${APP_AUTORUN_REGNAME}" '$INSTDIR\${APP_EXENAME} unvisible'
;SectionEnd

Section "바탕화면 아이콘 생성"
;  SetShellVarContext all
  SetOutPath "$INSTDIR"
  CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "" "$INSTDIR\${APP_EXENAME}" 0
SectionEnd

Section -AdditionalIcons
;  SetShellVarContext all
  SetOutPath "$INSTDIR"
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  CreateShortCut "$STARTMENU\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}"
  CreateShortCut "$STARTMENU\${PRODUCT_NAME}\${PRODUCT_NAME} 삭제.lnk" "$INSTDIR\uninst.exe"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} 삭제.lnk" "$INSTDIR\uninst.exe"
  CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "unvisible" "$INSTDIR\${APP_EXENAME}" 0
  WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd

Section -Post

;  SetShellVarContext all
  SetOutPath "$INSTDIR"
  WriteRegStr HKCU  "Software\Microsoft\Windows\CurrentVersion\Run" "${PRODUCT_NAME}" '$INSTDIR\${APP_EXENAME} unvisible'
 
  WriteRegStr HKCU "${PRODUCT_PASSDIR_REGKEY}" "DisplayIcon" "$INSTDIR\${APP_EXENAME}"
 
   ~ ~ ~ ~ ~ ~ ~
SectionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "${PRODUCT_NAME}을 삭제하시겠습니까?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  FindProcDLL::FindProc "${APP_EXENAME}"
  StrCmp $R0 1 mfound notmfound

  mfound:
    KillProcDLL::KillProc "${APP_EXENAME}"
  notmfound:

  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"

   ~ ~ ~ ~ ~ ~ ~

  Delete "$INSTDIR\*.*"
  RMDir /r "$INSTDIR"
 
  Delete "$STARTMENU\${PRODUCT_NAME}.lnk"

  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"

  DeleteRegKey HKCU "${PRODUCT_PASSDIR_REGKEY}"
  DeleteRegValue HKCU  "Software\Microsoft\Windows\CurrentVersion\Run" "${PRODUCT_NAME}"
 
  DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"

  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\${PRODUCT_NAME}_RASAPI32"
  DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\${PRODUCT_NAME}_RASMANCS"

  SetShellVarContext all
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*"

 
  SetAutoClose true
SectionEnd

 

'개발팁( NSIS)' 카테고리의 다른 글

NSIS에서 MS-SQL 연결하여 데이타 입력하기  (0) 2013.07.24
top