我必须使用ExecShell
,因为我的主程序仅具有用户权限,并且该程序内的被调用exe文件需要管理员权限。
RequestExecutionLevel user
ExecShell "open" "file.exe" SW_HIDE
我想获取返回码,我尝试pop $0, pop $1
,但是我总是为零。同样,如果文件不成功。
我相信pop $0
不会等待ExecShell
命令,但是由于需要管理员权限,所以我无法使用ExecWait
。如何获得真正的返回码?
答案 0 :(得分:1)
ExecShell
不报告错误代码,因为它不等待该过程。
如果您想要退出代码,则必须手动调用ShellExecuteEx
:
!include LogicLib.nsh
!include WinCore.nsh
!ifndef SEE_MASK_NOCLOSEPROCESS
!define SEE_MASK_NOCLOSEPROCESS 0x00000040
!endif
Section
StrCpy $1 "Calc.exe" ; File to execute
System::Call '*(&l4, i ${SEE_MASK_NOCLOSEPROCESS}, p$HWNDPARENT, p0, tr1, p0, p0, p5, p0, p0, p0, p0, p0, p0, p)p.r1'
System::Call 'SHELL32::ShellExecuteEx(t)i.r0 (pr1)' ; (t) is a hint for A/W detection
${If} $0 <> 0
System::Call '*$1(i, i, p, p, p, p, p, p, p, p, p, p, p, p, p.r0)'
System::Call 'KERNEL32::WaitForSingleObject(p r0, i ${INFINITE})'
System::Call 'KERNEL32::GetExitCodeProcess(p r0 s,*i.r0)'
System::Call 'KERNEL32::CloseHandle(p s)'
DetailPrint ExitCode=$0
${EndIf}
System::Free $1
SectionEnd