Danke für die Vielen Beiträge
#NULL hat geschrieben:Was sagen denn die ersten beiden Ifs?
Was ist
lf?
___________________________________________________________________
Hab jetzt mal ein Modul dafür geschrieben das zumindest mal grundlegend funktioniert.
Bin für jeden Verbesserungsvorschlag dankbar.
-> Vorallem bei ExitCode() ob das so richtig ist ?
(GetExitProcess oder GetExitThread?)
Code:
Code: Alles auswählen
DeclareModule PROCESS
Declare.i Create(File.s,Parameter.s)
Declare.i Running(*Process)
Declare.i DataAvailable(*Process)
Declare.s DataRead(*Process)
Declare.s File(*Process)
Declare.s Parameter(*Process)
Declare.i ExitCode(*Process)
Declare.i Close(*Process)
EndDeclareModule
Module PROCESS
EnableExplicit
;Module PROCESS
;By Mijikai
;Version: draft
;PB v.5.62 x64 (Win7)
Structure PROCESS_STRUCT
Exe.s
Parameter.s
PipeRead.i
PipeWrite.i
Security.SECURITY_ATTRIBUTES
Startup.STARTUPINFO
Info.PROCESS_INFORMATION
BytesAvailable.i
EndStructure
Procedure.i Create(File.s,Parameter.s)
Protected *Process.PROCESS_STRUCT
*Process = AllocateStructure(PROCESS_STRUCT)
If *Process
With *Process
\Security\bInheritHandle = #True
If CreatePipe_(@\PipeRead,@\PipeWrite,@\Security,#Null)
\Startup\cb = SizeOf(STARTUPINFO)
\Startup\dwFlags = #STARTF_USESTDHANDLES
\Startup\hStdInput = \PipeRead
\Startup\hStdOutput = \PipeWrite
\Startup\hStdError = \PipeWrite
If CreateProcess_(File,Parameter,@\Security,@\Security,#True,#Null,#Null,#Null,@\Startup,@\Info)
ProcedureReturn *Process
EndIf
CloseHandle_(\PipeRead)
CloseHandle_(\PipeWrite)
EndIf
EndWith
FreeStructure(*Process)
EndIf
EndProcedure
Procedure.i Running(*Process.PROCESS_STRUCT)
With *Process
ProcedureReturn Bool(WaitForSingleObject_(\Info\hProcess,10) <> #WAIT_TIMEOUT)
EndWith
EndProcedure
Procedure.i DataAvailable(*Process.PROCESS_STRUCT)
With *Process
PeekNamedPipe_(\PipeRead,#Null,#Null,#Null,@\BytesAvailable,#Null)
ProcedureReturn \BytesAvailable
EndWith
EndProcedure
Procedure.s DataRead(*Process.PROCESS_STRUCT)
Protected *Buffer
Protected BufferSize.i
Protected Result.s
With *Process
If \BytesAvailable > #Null
*Buffer = AllocateMemory(\BytesAvailable)
If *Buffer
If ReadFile_(\PipeRead,*Buffer,\BytesAvailable,@BufferSize,#Null)
If BufferSize
Result = PeekS(*Buffer,BufferSize,#PB_Ascii)
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
EndIf
EndWith
ProcedureReturn Result
EndProcedure
Procedure.s File(*Process.PROCESS_STRUCT)
With *Process
ProcedureReturn \Exe
EndWith
EndProcedure
Procedure.s Parameter(*Process.PROCESS_STRUCT)
With *Process
ProcedureReturn \Parameter
EndWith
EndProcedure
Procedure.i ExitCode(*Process.PROCESS_STRUCT)
Protected Code.i
With *Process
GetExitCodeThread_(\Info\hThread,@Code)
ProcedureReturn Code
EndWith
EndProcedure
Procedure.i Close(*Process.PROCESS_STRUCT)
With *Process
CloseHandle_(\Info\hProcess)
CloseHandle_(\Info\hThread)
CloseHandle_(\PipeRead)
CloseHandle_(\PipeWrite)
EndWith
FreeStructure(*Process)
EndProcedure
EndModule
EnableExplicit
Global Handle.i
Procedure.s FFMPEG(Video.s,Audio.s,File.s)
Video = " -i " + #DQUOTE$ + Video + #DQUOTE$
Video + " -i " + #DQUOTE$ + Audio + #DQUOTE$
Video + " -vcodec h264 " + #DQUOTE$ + File + #DQUOTE$
ProcedureReturn Video
EndProcedure
DeleteFile("test.mp4")
Handle = PROCESS::Create("ffmpeg.exe",FFMPEG("test.webm","test.weba","test.mp4"))
If Handle
Repeat
If PROCESS::DataAvailable(Handle)
Debug PROCESS::DataRead(Handle)
EndIf
Until PROCESS::Running(Handle)
Debug PROCESS::ExitCode(Handle);<- immer Null !?
PROCESS::Close(Handle)
EndIf
Repeat:Delay(100):ForEver
End