0

わかりました、nsi スクリプトの簡略化されたバージョンがあります (以下を参照)。A2 セクションでは、単一の実行可能ファイルを指定されたインストール パスにコピーし、環境変数を作成してから、現在実行中のすべてのプロセスに環境変数の変更を認識させることになっている SendMessage を実行します。ただし、リンクセクションで作成したショートカットが機能しないため、NSISインストーラープロセス自体が更新されていないようです

インストーラー.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 が、新しく作成された環境変数をすべてに認識させる必要があることを示しているようです。この謎を解ける方、よろしくお願いします。付属の installer.nsi スクリプトを使用して、私の状況を再現できます。また、複数の環境 (XP、Vista、7、管理者の有無など) でこの動作が見られることにも注意してください。

4

1 に答える 1

0

ほとんどのアプリケーションは、そのメッセージ ブロードキャストを処理しません。ほとんどの場合、explorer.exe だけです。

変数はインストーラー プロセスで直接更新でき、子プロセスにも継承されます。

System::Call 'Kernel32::SetEnvironmentVariable(t "ENGINE", t "v8")'
于 2013-07-18T02:28:30.053 に答える