我已经使用NSIS为Windows编写了一个安装程序。 如果从控制台运行程序,我想将一些信息写入此控制台。
我的代码看起来像这个问题中的那个...
NSIS - printing to prompt during command line install
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
System::Call 'kernel32::AttachConsole(i -1)i.r1'
FileWrite $0 "hello"
安装程序没有问题。但是,如果我运行卸载程序,则没有输出,$ 1 == 0。
对于这种情况,安装程序和卸载程序之间是否存在差异?
答案 0 :(得分:1)
卸载程序将从%Temp%运行自身的副本,除非您使用特殊的_?=$Instdir
参数启动它。 (这样做Delete "$Instdir\uninstall.exe"
有效)
这意味着第二个卸载程序实例中的AttachConsole(ATTACH_PARENT_PROCESS)
将尝试附加到没有控制台的父进程。父级没有控制台,因为NSIS卸载程序是一个GUI应用程序而且那些没有自动获得控制台而且_?=
处理发生在.onInit之前所以 hack 附加到一个永远不会发生
我认为没有办法解决这个问题而不使用_?=
。使用AttachConsole是一种破解,在GUI应用程序中永远不会完美运行......