Hola.
Puedes ejecutar programas secuencialmente, lo único que tienes que hacer es indicarle que espere hasta que el proceso termine antes de llamar al siguiente. Hablando más claramente (en código) sería:
Código Delphi
[-]type
TLaunchMode = (lmNormal, lmMaximized, lmMinimizedActive, lmMinimizedInactive, lmHide);
TPriority =(pIdle, pNormal, pHigh,pRealTime);
function LaunchExtended(Filename:String; WaitForEnd: Boolean; TimeForWait:Cardinal=0; Parameters, StartFolder:String; LaunchMode:TLaunchMode; Priority:TPriority):Integer;
var
Directorio, ArchivoyParametros: PChar;
ModoMostrar, Prior: Integer;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
Cancel:Boolean;
begin
if TimeForWait=0 then TimeForWait:=INFINITE;
if Parameters='' then
ArchivoyParametros:=PChar(FileName)
else
ArchivoyParametros:=PChar(FileName+' '+Parameters);
if StartFolder='' then
Directorio:=nil
else
Directorio := PChar(StartFolder);
case LaunchMode of
lmNormal: ModoMostrar := SW_SHOWNORMAL;
lmMaximized: ModoMostrar := SW_SHOWMAXIMIZED;
lmMinimizedActive: ModoMostrar := SW_SHOWMINIMIZED;
lmMinimizedInactive: ModoMostrar := SW_SHOWMINNOACTIVE;
lmHide: ModoMostrar := SW_HIDE;
end;
case Priority of
pIdle: Prior:=IDLE_PRIORITY_CLASS;
pNormal: Prior:= NORMAL_PRIORITY_CLASS;
pHigh: Prior:= HIGH_PRIORITY_CLASS;
pRealTime: Prior:=REALTIME_PRIORITY_CLASS;
end;
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := ModoMostrar;
if (CreateProcess(nil, ArchivoyParametros, nil, nil, False, CREATE_NEW_CONSOLE or Prior, nil, Directorio, StartupInfo, ProcessInfo)) then
begin
result:=0;
if WaitForEnd then Result:=WaitforSingleObject(ProcessInfo.hProcess, TimeForWait);
end
else
result:=-1;
end;
Debes llamar el procedimiento por ejemplo de la siguiente forma:
Código Delphi
[-]LaunchExtended(FileName, WaitForEnd, TimeForWait, Parameters, StartFolder, LaunchMode, Priority:TPriority)
por ejemplo
Código Delphi
[-]LaunchExtended('C:\Windows\System32\Calc.exe', True, 0,'', 'C:\Windows\System32', lmNormal, pNormal)
donde Filename es el nombre del archivo ejecutable que deseas correr; WaitForEnd es un booleano que indica si quieres que la rutina espere a que el ejecutable se cierre para retornar; TimeForWait es la cantidad de milisegundos que la rutina debe esperar por que el ejecutable se cierre antes de retornar, si no se ha cerrado en ese tiempo retorna igual, si quieres que espere indefinidamente hasta que se cierre debes especificar 0 en este parámetro; Parameters son los parámetros que quieres pasarle al ejecutable; StartFolder es la carpeta de inicio para ese ejecutable (normalmente la misma en que se encuentra); LaunchMode es el modo en que quieres que la ventana se ejecute (normal, minimizada, maximizada, etc); y Priority es la prioridad con que quieres que se ejecute el archivo (baja, normal, alta, etc). La rutina devuelve 0 si el archivo se pudo ejecutar o -1 si no se pudo ejecutar.