2016-07-07 1 views
0

설치하는 동안 재배포 가능 파일을 설치합니다. 내 프로그램을 설치 한 후 설치 중에 프로그램을 실행하고 싶습니다. 이를 위해 재배포 가능 항목이 필요합니다. 하지만 환경이 설치 중에 새로 고쳐지지 않아 프로그램을 시작할 수 없습니다. 설치하는 동안 환경을 새로 고칠 수 있습니까, 아니면 환경을 다시 읽을 수 있습니까? 또는 재배포 가능 설치 후에 변경된 시스템 환경을 읽으십시오.설치 중 nsis 새로 고침 환경

설치하는 동안 재배포 가능 파일을 설치하는 동안 변경된 환경이 필요합니다.

도움 주셔서 감사합니다.

+0

사용자 정의 변수를 새로 고쳐야 또는 % 경로 %에 대해 이야기하고 있습니까? – Anders

+0

% Path %에 대해 이야기하고 있습니다. – infingy

+0

% Path % 새로 고침은 레지스트리의 두 위치에 저장되며 NSIS 문자열 길이 제한을 초과하지 않도록주의해야합니다. – Anders

답변

0

나는 귀하의 동일한 문제를 해결 방법으로 해결했지만이 솔루션을 발견했으며 귀하와 공유하고 싶습니다.

이 설치하는 동안 환경 변수를 다시로드해야합니다

!include LogicLib.nsh 
!include WinCore.nsh 
!ifndef NSIS_CHAR_SIZE 
    !define NSIS_CHAR_SIZE 1 
    !define SYSTYP_PTR i 
!else 
    !define SYSTYP_PTR p 
!endif 
!ifndef ERROR_MORE_DATA 
    !define ERROR_MORE_DATA 234 
!endif 
/*!ifndef KEY_READ 
    !define KEY_READ 0x20019 
!endif*/ 

Function RegReadExpandStringAlloc 
    System::Store S 
    Pop $R2 ; reg value 
    Pop $R3 ; reg path 
    Pop $R4 ; reg hkey 
    System::Alloc 1 ; mem 
    StrCpy $3 0 ; size 

    loop: 
     System::Call 'SHLWAPI::SHGetValue(${SYSTYP_PTR}R4,tR3,tR2,i0,${SYSTYP_PTR}sr2,*ir3r3)i.r0' ; NOTE: Requires SHLWAPI 4.70 (IE 3.01+/Win95OSR2+) 
     ${If} $0 = 0 
      Push $2 
      Push $0 
     ${Else} 
      System::Free $2 
      ${If} $0 = ${ERROR_MORE_DATA} 
       IntOp $3 $3 + ${NSIS_CHAR_SIZE} ; Make sure there is room for SHGetValue to \0 terminate 
       System::Alloc $3 
       Goto loop 
      ${Else} 
       Push $0 
      ${EndIf} 
     ${EndIf} 
    System::Store L 
FunctionEnd 

Function RefreshProcessEnvironmentPath 
    System::Store S 
    Push ${HKEY_CURRENT_USER} 
    Push "Environment" 
    Push "Path" 
    Call RegReadExpandStringAlloc 
    Pop $0 

    ${IfThen} $0 <> 0 ${|} System::Call *(i0)${SYSTYP_PTR}.s ${|} 
    Pop $1 
    Push ${HKEY_LOCAL_MACHINE} 
    Push "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
    Push "Path" 
    Call RegReadExpandStringAlloc 
    Pop $0 

    ${IfThen} $0 <> 0 ${|} System::Call *(i0)${SYSTYP_PTR}.s ${|} 
    Pop $2 
    System::Call 'KERNEL32::lstrlen(t)(${SYSTYP_PTR}r1)i.R1' 
    System::Call 'KERNEL32::lstrlen(t)(${SYSTYP_PTR}r2)i.R2' 
    System::Call '*(&t$R2 "",&t$R1 "",i)${SYSTYP_PTR}.r0' ; The i is 4 bytes, enough for a ';' separator and a '\0' terminator (Unicode) 
    StrCpy $3 "" 

    ${If} $R1 <> 0 
    ${AndIf} $R2 <> 0 
     StrCpy $3 ";" 
    ${EndIf} 

    System::Call 'USER32::wsprintf(${SYSTYP_PTR}r0,t"%s%s%s",${SYSTYP_PTR}r2,tr3,${SYSTYP_PTR}r1)?c' 
    System::Free $1 
    System::Free $2 
    System::Call 'KERNEL32::SetEnvironmentVariable(t"PATH",${SYSTYP_PTR}r0)' 
    System::Free $0 
    System::Store L 
FunctionEnd 

Section 
    Call RefreshProcessEnvironmentPath 
SectionEnd 

출처 : http://forums.winamp.com/showpost.php?p=3028153&postcount=12