Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Ejecutar programa DOS con redireccion de entrada (https://www.clubdelphi.com/foros/showthread.php?t=62294)

JF Sebastian 15-12-2008 19:30:36

Ejecutar programa DOS con redireccion de entrada
 
Buenas:
Se trata de ejecutar desde delphi un programa de MS-DOS que pide cierta entrada desde teclado.
Para automatizar esto redirijo la entrada con un fichero texto.
El programa ms-dos se llama: execufsm
El fichero de texto a redirigir se llama: in0.txt
in0.txt contiene dos nombres de ficheros con comillas simples:
'cu0.txt'
'cu0.out'
Desde la consola de ms-dos tecleo:

execufsm < in0.txt

y funciona perfectamente.
El problema esta en delphi que no me ejecuta el proceso siguiente:

Código Delphi [-]
var sc,sp: string;
    SUInfo: TStartupInfo;
    ProcInfo: TProcessInformation;
    tmpcard: cardinal;
    F1: TextFile;
begin
  ChDir(ExtractFileDir(paramStr(0)));
  AssignFile(F1,'in0.txt');
  Rewrite(F1);
  writeln(F1,'''cu0.txt''');
  writeln(F1,'''cu0.out''');
  CloseFile(F1);
  sc := 'execufsm.exe < in0.txt';
  sp := ExtractFilePath(ExtractFileDir(paramStr(0))+'\execufsm.exe');
  fillchar(SuInfo, sizeof(suinfo),#0);
  fillchar(ProcInfo, sizeof(procinfo),#0);
  SuInfo.cb := Sizeof(SuInfo);
  SUInfo.dwFlags := STARTF_USESHOWWINDOW;
  SUInfo.wShowWindow := SW_HIDE; //SW_SHOW;
  SUInfo.wShowWindow := SW_SHOW;
  if not createprocess(nil,
                       pchar(sc),
                       nil,
                       nil,FALSE,
                       CREATE_NEW_CONSOLE or
                       NORMAL_PRIORITY_CLASS,
                       nil,
                       pChar(sp),
                       SUInfo,
                       ProcInfo) then
  begin
    ShowMessage('FAIL');
    Exit;
  end;
  repeat
    Application.ProcessMessages;
    if GetExitCodeProcess(ProcInfo.hProcess, tmpcard) then
    begin
      if tmpCard = 0 then Break;
    end;
  until False or Application.Terminated;
  if TerminateProcess(ProcInfo.hProcess, tmpCard) then
    fillchar(ProcInfo, Sizeof(Procinfo),#0);

Se abre el programa pero se queda a la espera de introducir el texto con el teclado. Es decir no redirige la entrada de teclado.

El fichero que uso desde la consola es el que creo desde delphi y desde la consola funciona perfectamente...


Un saludo

JF Sebastian 15-12-2008 20:47:25

Juan palomo, yo me lo guiso, yo me lo como ...

http://members.aye.net/~bstowers/del...les/redir.html

Archer 26-12-2008 19:30:32

Algo parecido intente yo, solo que tambien redirigia la salida a un TMemo, funcionar funciono, pero con algunos 'peros' que nadie me ayudo a solucionar... hoy he estado repasandolo porque me vuelve a hacer falta y la dichosa linea del Peek sigue dando problemas, pero bueno, si le quieres pegar un vistazo...

http://www.clubdelphi.com/foros/showthread.php?t=25658

Saludos.

PD: Los problemas me los da si depuro (F7) o si ejecuto un "chkdsk.exe /f" sobre alguna unidad FAT bloqueada... curioso.

Archer 26-12-2008 19:32:09

De todas formas me he bajado la informacion que hay en la pagina web que indicas e igual me ayuda con lo mio, luego le pego un vistazo. Gracias.

JF Sebastian 27-12-2008 15:36:13

A mi el codigo de la web que te indico me funciona perfectamente. Es mas, lo he modificado para que mientras se ejecuta la aplicacion DOS lea mediante polling el fichero de salida y asi actualizar un progressbar con Application.ProcessMessages en lugar de WaitforSingleObject.
He tenido que cambiar el modo de apertura del fichero de texto ya que con reset no se puede por estar abierto en escritura.

Ya me contaras que tal te ha ido...


La franja horaria es GMT +2. Ahora son las 20:36:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi