*========================================================================================
* Executes another application, waits for it to complete and returns the error level
*========================================================================================
LParameter tcCmdLine
*--------------------------------------------------------------------------------------
* API declarations
*--------------------------------------------------------------------------------------
DECLARE INTEGER CreateProcess IN kernel32.DLL ;
String lpApplicationName, ;
STRING lpCommandLine, ;
INTEGER lpProcessAttributes, ;
INTEGER lpThreadAttributes, ;
INTEGER bInheritHandles, ;
INTEGER dwCreationFlags, ;
String lpEnvironment, ;
String lpCurrentDirectory, ;
STRING @lpStartupInfo, ;
STRING @lpProcessInformation
Declare long GetLastError in Win32API
*--------------------------------------------------------------------------------------
* Launch the application
*--------------------------------------------------------------------------------------
Local lcStartupInfo, lcProcessInfo, lnOK
lcStartupInfo = ;
BINTOC(68,"RS") + ;
Replicate(Chr(0),40) + ;
BinToC(1,"RS") + ;
BinToC(0,"2RS") + ; && SW_HIDE
BinToC(0,"2RS") + ;
Replicate(Chr(0),16)
lcProcessInfo = Replicate(Chr(0),16)
lnOK = CreateProcess( ;
NULL, ;
m.tcCmdLine, ;
0, ;
0, ;
1, ;
0x20, ;
NULL, ;
NULL, ;
@lcStartupInfo, ;
@lcProcessInfo ;
)
*--------------------------------------------------------------------------------------
* Extract the handles from the PROCESSINFO structure
*--------------------------------------------------------------------------------------
Local lnProcessHandle, lnThreadHandle
If m.lnOK == 0
Return -1
Else
lnProcessHandle = CTOBIN(Substr(m.lcProcessInfo,1,4),"RS")
lnThreadHandle = CTOBIN(Substr(m.lcProcessInfo,5,4),"RS")
EndIf
*--------------------------------------------------------------------------------------
* Wait for the process to terminate
*--------------------------------------------------------------------------------------
Declare Long WaitForSingleObject in Win32API Long, Long
WaitForSingleObject( m.lnProcessHandle, -1 )
*--------------------------------------------------------------------------------------
* Get the error code
*--------------------------------------------------------------------------------------
Local lnExitCode
lnExitCode = -1
Declare Long GetExitCodeProcess in Win32API ;
Long hProcess, ;
Long @lpExitCode
GetExitCodeProcess( m.lnProcessHandle, @lnExitCode )
*--------------------------------------------------------------------------------------
* Close handles
*--------------------------------------------------------------------------------------
Declare CloseHandle in Win32API Long
CloseHandle( m.lnProcessHandle )
CloseHandle( m.lnThreadHandle )
Return m.lnExitCode