I did this include that works in ascii and unicode, it's based on an ols code i found by Rings. It reads the standard output and error, you can use #PROCESS_JOIN_OUTPUT to read everything at once.
Code: Select all
;process.pb
;Justin 04/10
enableexplicit
structure PROCESS_OBJ
hReadStdOut.i
hWriteStdOut.i
hReadStdErr.i
hWwriteStdErr.i
process.PROCESS_INFORMATION
dataRead.i
lastErrChar.ASCII
lastStdChar.ASCII
endstructure
#PROCESS_JOIN_OUTPUT = 2 ;stdout and stderr are both redirected to the stdout pipe
declare.s proc__ReadLine(*lastChar.ASCII, *dataRead.i, hpipe.i)
;Public functions
procedure proc_RunProgram(program.s, commad.s, flags.l=0, *err.INTEGER=#null)
define.PROCESS_OBJ *this
define.STARTUPINFO start
define.SECURITY_ATTRIBUTES sa
define.i error
*this = allocatememory(sizeof(PROCESS_OBJ))
error = 0
;Create the Pipes
sa\nLength =SizeOf(SECURITY_ATTRIBUTES)
sa\bInheritHandle = 1
sa\lpSecurityDescriptor = 0
if CreatePipe_(@*this\hReadStdOut, @*this\hWriteStdOut, @sa, 0)
if CreatePipe_(@*this\hReadStdErr, @*this\hWwriteStdErr, @sa, 0)
start\cb = SizeOf(STARTUPINFO)
start\dwFlags = #STARTF_USESHOWWINDOW | #STARTF_USESTDHANDLES
start\hStdOutput = *this\hWriteStdOut
if flags & #PROCESS_JOIN_OUTPUT = #PROCESS_JOIN_OUTPUT
start\hStdError = *this\hWriteStdOut
else
start\hStdError = *this\hWwriteStdErr
endif
if CreateProcess_(0, program + " " + commad, @sa, @sa, 1, #NORMAL_PRIORITY_CLASS, 0, 0, @start, @*this\process)
CloseHandle_(*this\hWriteStdOut)
CloseHandle_(*this\hWwriteStdErr)
else ;CreateProcess error
error = -3
endif
else ;pipe error
error = -2
endif
else ;pipe error
error = -1
endif
if *err : *err\i = error : endif
if error=0
procedurereturn *this
else ;error
CloseHandle_(*this\hReadStdErr)
CloseHandle_(*this\hReadStdOut)
CloseHandle_(*this\hWriteStdOut)
CloseHandle_(*this\hWwriteStdErr)
freememory(*this)
procedurereturn #null
endif
endprocedure
procedure proc_CloseProgram(*this.PROCESS_OBJ)
CloseHandle_(*this\process\hProcess)
CloseHandle_(*this\process\hThread)
CloseHandle_(*this\hReadStdErr)
CloseHandle_(*this\hReadStdOut)
freememory(*this)
endprocedure
macro proc_ReadStdOutLine(this)
proc__ReadLine(@this\lastStdChar, @this\dataRead, this\hReadStdOut)
endmacro
macro proc_ReadStdErrLine(this)
proc__ReadLine(@this\lastErrChar, @this\dataRead, this\hReadStdErr)
endmacro
procedure proc_GetExitCode(*this.PROCESS_OBJ)
define.i exitCode
if GetExitCodeProcess_(*this\process\hProcess, @exitCode)
procedurereturn exitCode
endif
endprocedure
macro proc_TerminateProcess(this, exitcode)
TerminateProcess_(this\process\hProcess, exitcode)
endmacro
macro proc_DataRead(this)
this\dataRead
endmacro
procedure.s proc__ReadLine(*lastChar.ASCII, *dataRead.INTEGER, hpipe.i)
define.ASCII achar
define.s text
text = ""
while ReadFile_(hpipe, @achar, sizeof(ASCII), *dataRead, 0)
if achar\a = #CR
*lastChar\a = achar\a
break
elseif achar\a = #LF and *lastChar\a = #CR
*lastChar\a = achar\a
continue
endif
text = text + peeks(@achar, sizeof(ASCII), #PB_Ascii)
*lastChar\a = achar\a
wend
procedurereturn text
endprocedure
Code: Select all
;test
define.s program, cmd, line, text
define.PROCESS_OBJ *proc
define.i prog, counter
program = "c:\lame\lame.exe"
cmd = "--abr 30 --nohist --noreplaygain C:\test.mp3 C:\test_out.mp3"
*proc = proc_RunProgram(program, cmd, 0)
if *proc
counter = 1
line = proc_ReadStdErrLine(*proc)
while proc_DataRead(*proc)
if counter=10
proc_TerminateProcess(*proc, 100)
endif
debug line
line = proc_ReadStdErrLine(*proc)
counter + 1
wend
debug proc_GetExitCode(*proc)
proc_CloseProgram(*proc)
endif