2013-07-16 104 views
0

好的,我有一個我的nsi腳本的簡化版本(見下文)。在A2部分中,我將單個可執行文件複製到指定的安裝路徑,創建環境變量,然後執行一個SendMessage,它應該讓所有當前正在運行的進程知道env的變化。然而,似乎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