【发布时间】:2014-08-27 01:37:12
【问题描述】:
使用 NSIS,我想在安装新版本之前从我的安装程序中调用以前安装的版本的卸载程序。这个proposed solution就是执行下面的命令:
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
据我了解,需要_?=$INSTDIR 才能使ExecWait 真正等待。没有它,NSIS 会将卸载程序复制到临时目录,在那里启动它,然后在卸载程序完成之前返回。这个解决方案的问题是,卸载程序直接在 $INSTDIR 中执行。这导致我的卸载程序中的以下命令失败:
Delete "$INSTDIR\uninstall.exe"
据我了解,uninstall.exe没有被删除的原因是,当前正在执行的文件不能被删除。总结一下我的问题:
ExecWait '"$INSTDIR\uninstall.exe"'
不等待卸载程序完成并且
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
不允许卸载程序自行删除。有谁知道,如何在等待卸载程序完成的同时让卸载程序在卸载过程中立即删除自己?
【问题讨论】:
-
ExecWait 总是等待子进程,在你的情况下,这个子进程很快就会完成......
-
我读到 ExecWait 只等到卸载程序被复制到临时目录并在临时目录中启动。它绝对不会等待卸载程序完成。我使用一些消息框对此进行了测试。
-
ExecWait 是一个通用指令,它总是等待子进程,您执行的东西(卸载程序)将快速退出的事实不是 ExecWaits 错误。 ExecWait 是原生 CreateProcess 和 WaitForSingleObject 函数的薄包装......
-
我想我们的理解是一样的。我的想法不是在这里责怪 ExecWait。我想提一下,使用 ExecWait 的给定解决方案并没有达到我的预期。
标签: installation nsis uninstallation