无法更改特定 OutPut .exe 名称的 .exe 图标 (NSIS)

Can't change .exe-icon for specific OutPut .exe-name (NSIS)

我是 运行 Windows 8.1,正在使用 NSIS 为我的 java 程序创建一个启动器。为了尝试编写脚本,我刚刚制作了一个丑陋的 A.ico 并将其用于我的 Program.exe。现在我制作了一个漂亮的 B.ico 并使用相同的脚本我试图将其设置为我的 Program.exe.

的图标

问题是,即使我相应地更改了脚本,A.ico 仍然用于 Program.exe,我似乎无法更改它。这太奇怪了,因为如果我将输出 .exe 的名称更改为例如其他Program.exe选择了正确的B.ico。如果我随后将 .exe 重命名为 Program.exe,图标将切换回我眼前的 A.ico!!

我是不是漏掉了什么?我的系统是否保存了每个名为 Program.exe 的文件都必须具有图标 A.icon,只是因为我在第一个脚本中使用了它?

Name "Program"
Caption "LMX Launcher"
Icon "hidden\B.ico"
OutFile "Program.exe"

RequestExecutionLevel user

!include "FileAssociation.nsh"

SilentInstall silent
AutoCloseWindow true
ShowInstDetails nevershow

Section ""
  Call GetJRE
  Pop $R0
  StrCpy [=10=] '$R0 -jar hidden\getdown.jar hidden\'
  SetOutPath $EXEDIR
  ExecWait [=10=]
  ${unregisterExtension} ".lm" "LM-fil"
  ${registerExtension} "Program.exe" ".lm" "LM-fil"
SectionEnd

Function GetJRE
  Push $R0
  Push $R1

  ClearErrors
  StrCpy $R0 "$EXEDIR\jre\bin\javaw.exe"
  IfFileExists $R0 JreFound
  StrCpy $R0 ""

  ClearErrors
  ReadEnvStr $R0 "JAVA_HOME"
  StrCpy $R0 "$R0\bin\javaw.exe"
  IfErrors 0 JreFound

  ClearErrors
  ReadRegStr $R1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
  ReadRegStr $R0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment$R1" "JavaHome"
  StrCpy $R0 "$R0\bin\javaw.exe"

  IfErrors 0 JreFound
  StrCpy $R0 "javaw.exe"

 JreFound:
  Pop $R1
  Exch $R0
FunctionEnd

听起来像是 Windows 图标缓存问题,而不是 NSIS 问题。您可以使用以下命令清空缓存:

ie4uinit.exe -ClearIconCache

正如 在他的回答中所说,这很可能是 Windows shell 图标缓存问题。

要验证这是不是问题,您可以下载 Resource Hacker 或使用图标编辑器检查 .exe 中的图标。