How can I make this function actually work in NSIS?

℡╲_俬逩灬. 提交于 2020-01-06 06:31:37

问题


I am trying to factor out a snippit of code I have ALL OVER my NSIS installer. The snippet is as follows:

nsExec::ExecToStack 'Dism.exe /Online /Enable-Feature /FeatureName:NetFx3'
Pop $0

${If} $0 != 0
   Pop $0
   Push ".NET 3.5 failed to install: $\n$0"
   Call DetailPrintTS
   StrCpy $Errors "$Errors Errors From .NET 3.5 install:$\n$0$\n$\n"
${EndIf}

So I'd like to factor this to something like:

Function LoggedExec
   Pop $0
   Pop $1

   nsExec::ExecToStack $0
   Pop $0

   ${If} $0 != 0
      Pop $0
      Push "$1 failed to install: $\n$0"
      Call DetailPrintTS
      StrCpy $Errors "$Errors Errors From $1 install:$\n$0$\n$\n"
   ${EndIf}
FunctionEnd

and then call it as follows:

Push 'Dism.exe /Online /Enable-Feature /FeatureName:NetFx3'
Push '.NET 3.5'
Call LoggedExec

Note that DetailPrintTS is another function I made that includes a timestamp in DetailPrint:

Function DetailPrintTS
   Pop $7

   ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6

   DetailPrint "$4:$5:$6 -- $7$\n"
FunctionEnd

回答1:


Remember that Push / Pop are acting on a stack (in other words, a lifo: last in, first out).

From your snippet, you seem to Pop the arguments in LoggedExec in the same order that they were Pushed. Instead, if you Push the command and after the text for the log, you need to Pop in reversed order:

Push 'Dism.exe /Online /Enable-Feature /FeatureName:NetFx3'
Push '.NET 3.5'
Call LoggedExec

;in LoggedExec
pop $1
pop $0


来源:https://stackoverflow.com/questions/15420224/how-can-i-make-this-function-actually-work-in-nsis

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!