NSIS:获取ExecShell的返回码

时间:2018-08-13 11:31:15

标签: nsis

我必须使用ExecShell,因为我的主程序仅具有用户权限,并且该程序内的被调用exe文件需要管理员权限。

 RequestExecutionLevel user  

 ExecShell "open" "file.exe" SW_HIDE

我想获取返回码,我尝试pop $0, pop $1,但是我总是为零。同样,如果文件不成功。 我相信pop $0不会等待ExecShell命令,但是由于需要管理员权限,所以我无法使用ExecWait。如何获得真正的返回码?

1 个答案:

答案 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