qué hace p.bat? estás seguro que se está ejecutando? porque si ejecutas la función de arriba el control NO es devuelto hasta que lo que mandas a ejecutar no termina.
Haz una prueba y verás:
ShellExec('cmd','', SW_NORMAL, true);
Application.Terminate;
Hasta que no escribes "exit" en la consola de comandos que se levanta, el programa no termina...
otra prueba:
hice un archivo p.bat conteniendo lo siguiente:
echo Hola ClubDelphi! > c:\archivo.prueba
Luego en un proyecto nuevo, en el OnFormCreate puse:
Código Delphi
[-]
procedure TForm1.FormCreate(Sender: TObject);
var
cadena: string;
F: TextFile;
begin
ShellExec('c:\p.bat','', SW_HIDE, true);
if FileExists('c:\archivo.prueba') then
begin
AssignFile(F, 'c:\archivo.prueba');
Reset(F);
Readln(F, cadena);
CloseFile(F);
ShowMessage('Al archivo lo veo y dice: '+ cadena);
DeleteFile('c:\archivo.prueba');
end;
Application.Terminate;
end;