La Web del Programador: Comunidad de Programadores
 
    Pregunta:  10778 - COMO EJECUTAR UN FICHERO *.EXE DESDE UN PROGRAMA PASCAL
Autor:  ERNEST SURIA RUIZ
Tengo necesidad de jecutar un fichero EXE situado en el DOS desde un programa escrito en pascal. Para entrar en el directorio especificado desde pascal no tengo problema, pero luego no consigo ejectar el fichero EXE. Gracias

  Respuesta:  Diego Romero
Hablando siempre de Turbo Pascal 7.0 la ayuda del procedimiento estandar Exec() de la unidad DOS es muy clara. Pero por las dudas aqui repito el codigo de ejemplo.

{$M $4000,0,0 } { 16K stack, no heap }
uses Dos;
var
ProgramName, CmdLine: string;
begin
Write('Program to Exec (full path): ');
ReadLn(ProgramName);
Write('Command line to pass to ',
ProgramName, ': ');
ReadLn(CmdLine);
WriteLn('About to Exec...');
SwapVectors;
Exec(ProgramName, CmdLine);
SwapVectors;
WriteLn('...back from Exec');
if DosError <> 0 then{ Error? }
WriteLn('Dos error #', DosError)
else
WriteLn('Exec successful. ',
'Child process exit code = ',
DosExitCode);
end.

  Respuesta:  Dabiz Spuch Calvar
Sólo tienes que usar la instrucción Exec. Es necesaria reducir el tamaño del Heap para que pueda ejecutar el programa. Además debes llamar swapvectors antes y después de Exec para que no se confundan los manejadores de interrupciones.

Ejemplo:

{$M 50000,0,0} { Reserva 50000 bytes de la pila }
USES Dos,Crt;

PROCEDURE Inicio;
VAR LineaParametros : string;
DirString : string;
Dir : integer;
BEGIN
FOR Dir := 1 TO 255 DO
BEGIN
Str (Dir,DirString);
LineaParametros := '-a ' + ParamStr(1) + DirString;
SwapVectors;
Exec ('c:\windows\nbtstat.exe',LineaParametros);
SwapVectors;
END
END;

BEGIN Inicio END.