2013-07-16 5 views
0

좋아, 내 nsi 스크립트의 단순화 된 버전이 있습니다 (아래 참조). A2 섹션에서 하나의 실행 파일을 지정된 설치 경로에 복사하고 환경 변수를 만든 다음 현재 실행중인 모든 프로세스가 env 변경을 인식하도록하는 SendMessage를 수행합니다. 그러나, 내가 링크 섹션에서 만든 바로 가기가 작동하지 않기 때문에 NSIS 설치 과정 자체가 업데이트되지 않는 것 같다환경 변수를 사용하는 NSIS CreateShortcut

installer.nsi :

다음
SetCompressor /FINAL zlib 

!include LogicLib.nsh 
!include WinMessages.nsh 
!include x64.nsh 

!define ENGINE "TEST" 
!define DERIV "A2" 
!define LIB_VER "v43" 
!define RELEASE "v3dev2" 

Name "${ENGINE}${DERIV} DTE ${RELEASE}" 
OutFile "${ENGINE}${DERIV}-DTE.exe" 

; display the installation directory page 
; note that NSIS places the selected directory in $INSTDIR 
; DirText "" 
Page directory setDefaultInstallDirectory 
Function setDefaultInstallDirectory 
    ;check for an existing sim root and set it as 
    the default installation directory  if it exists 
    ReadEnvStr $1 SIM_ROOT 
    ${If} $1 != "" 
     StrCpy $INSTDIR $1 
    ${EndIf} 
FunctionEnd 

; display the installation page and show a message 
; when the installation is complete 
Page instfiles "" "" finished 
Function finished 
    MessageBox MB_OK "Installation Complete." 
FunctionEnd 

section "A2" 
SetOutPath $INSTDIR\${ENGINE}\${DERIV} 
File alt_control.exe 

; Environment Variables 
WriteRegStr HKCU "Environment" "SIM_ROOT" "$INSTDIR" 

WriteRegStr HKCU "Environment" "ENGINE" "${ENGINE}" 

WriteRegStr HKCU "Environment" "DERIV" "${DERIV}" 

WriteRegExpandStr HKCU "Environment" "RUN_DIR" "%SIM_ROOT%\%ENGINE%\%DERIV%" 

; Broadcast to all processes that they need to update their environment 
; http://forums.winamp.com/showthread.php?t=118501 
SendMessage ${HWND_BROADCAST} 
     ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 
sectionEnd 

section "Links" 
; create the start menu directory & shortcuts 
CreateDirectory $SMPROGRAMS\DTE 
SetOutPath "$INSTDIR" 
CreateShortCut "$SMPROGRAMS\DTE\AltControl.lnk" 
      "$INSTDIR\%ENGINE%\%DERIV%\alt_control.exe" 

; Broadcast to all processes that they need to update their environment 
; http://forums.winamp.com/showthread.php?t=118501 
SendMessage ${HWND_BROADCAST} 
     ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 
sectionEnd 

설치 프로그램을 실행 한 후, 시작 메뉴 바로 가기 AltControl.lnk를 실행하려고하면 Windows에 바로 가기 오류가 발생합니다. 구체적으로 : "Windows가 alt_control.exe를 검색하고 있습니다. 파일을 직접 찾으려면 찾아보기를 클릭하십시오."

설치를 수행 할 때 환경 변수가 이미 있으면 링크가 작동합니다. 심지어 더 이상한, 시작 메뉴 바로 가기 속성을 클릭하고 사소한 변경 (추가 및 주석 필드의 공백 제거)을 누른 다음 적용을 클릭하면 Windows AltControl.lnk 파일을 다시 생성하는 것 같습니다 (.lnk 파일 대화 상자를 통해 아무런 기능적 변화가 없었음에도 불구하고 크기가 커졌습니다!). 그래서 그것은 NSIS 또는 생성/해결 .lnk 파일을 담당하는 일부 배경 Windows 프로세스가 설치 프로세스 중에 새로 생성 된 환경 변수를 선택하지 않는 것 같습니다. 나는 웹을 샅샅이 뒤졌고, 내가 사용하고있는 SendMessage가 새로 생성 된 env 변수를 모두 알아야한다는 것을 나타낼 것 같다. 누구든지이 수수께끼를 푸는 데 미리 감사드립니다. 포함 된 installer.nsi 스크립트를 사용하여 제 상황을 복제 할 수 있습니다. 또한 여러 환경 (XP, Vista, 7, 관리자 있음/없음 등)에서이 동작을 나타냅니다.

답변

0

대부분의 응용 프로그램은 해당 메시지 방송을 처리하지 않으며 대부분 explorer.exe에만 해당됩니다.

당신은 자식 프로세스하여 설치 과정에 직접 변수를 업데이트 할 수 있습니다 그리고 또한 상속됩니다

System::Call 'Kernel32::SetEnvironmentVariable(t "ENGINE", t "v8")' 
+0

와우는 - 확인하는 전화가 .LNK을 강제로 추가하는 작업! 만세! :) 그러나 시스템 변수 -> 고급 -> 환경 변수에서 변수를 정의하려면 WriteRegStr 호출을해야합니다. 예상된다면 큰 문제가 아닙니다. 너는 생명의 은인이야! Preesh! – arette

+0

네, 시스템 콜은 설치 프로그램 프로세스를위한 것입니다 ... – Anders

+0

다시 한번 감사드립니다. - 이것으로 다른 사람들을 도울 것입니다. – arette

관련 문제