Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-03-2007
erika.martinez erika.martinez is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires - Argentina
Posts: 18
Poder: 0
erika.martinez Va por buen camino
Unhappy Leer texto de otra aplicación

Hola

Mi problema es el siguiente, tengo que ejecutar desde Delphi una aplicación que corre bajo DOS,
la entrada a esta aplicación es solamente por teclado y lo que me devuelve lo hace en pantalla.
Consultando acá en el foro ya encontré la solución a los primeros puntos, es decir ya ejecuté
esta aplicación desde Delphi y envié los datos mediante simulación de teclado. Lo que me falta
es traerme lo que esta aplicación me devuelve a Delphi, lo que me devuelve es texto, sería
básicamente poder traerme a Delphi la líneas que hay dentro de la pantalla de command.com
¿Hay alguna forma de hacer esto? Si alguien puede ayudarme realmente estaré muy agradecida.
Responder Con Cita
  #2  
Antiguo 26-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Prueba con algo como esto:

http://www.clubdelphi.com/foros/show...45&postcount=6
Responder Con Cita
  #3  
Antiguo 27-03-2007
erika.martinez erika.martinez is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires - Argentina
Posts: 18
Poder: 0
erika.martinez Va por buen camino
Gracias seoane por tu respuesta. Lamentablemente no consigo adaptar el ejemplo que me diste a mi aplicación. Creo que el tema tiene que ver con el programita que yo ejecuto. Por ejemplo, para ejecutar este programita directamente desde command.com, tengo que poner todo el path: c:\vienna.rnafold.exe, no es una simple "instrucción?" como 'time', entonces en el ejemplo que me das en la instrucción:

GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);

lo que obtengo en Buffer es: 'C:\windows\system32\cmd.exe'

La verdad es que soy principiante en esto de programar en Delphi y no manejo mucho el tema de las funciones de la API de Windows. Si alguien puede darme una mano, GRACIAS!
Responder Con Cita
  #4  
Antiguo 27-03-2007
Avatar de DTAR
DTAR DTAR is offline
Miembro
 
Registrado: nov 2005
Posts: 53
Poder: 19
DTAR Va por buen camino
Lightbulb

hola... no es una solucion elegante,pero creo que puede funcionar...
lo que habria que hacer seria...
al ejecutar tu programa con los parametros correspondientes enviar todo eso a tu archivo de texto y despues levantarlo...
nose que funcion estaras utilizando para ejecutar tu aplicacion externa pero te doy un ejemplo ilustrativo...

ShellExecute('c:\MyDirectorio\MyAplicacion.exe','Parametro 1','> resultado.txt')
despues levantas el txt y recuperas los datos que a ejecutado esa apliacion...
espero que te sirvar de algo...
__________________
|DTAR|
Responder Con Cita
  #5  
Antiguo 27-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
CreateDOSProcessRedirected

Si la salida del programa es la estandar, debería utilizar un procedimiento tal cual se describe en este hilo
CreateDOSProcessRedirected

Además cito otro procedimiento con el cual podría controlar el programa sin necesidad de enviarle teclas, eso en el caso de que tuviera la entrada estandar.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #6  
Antiguo 27-03-2007
erika.martinez erika.martinez is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires - Argentina
Posts: 18
Poder: 0
erika.martinez Va por buen camino
Tal vez si conocen el código que estoy usando sea más fácil para ustedes entender mi problema. el código es el siguiente:


Código Delphi [-]
procedure TForm1.PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{Este código lo obtuve en el Club Delphi}
{************************************************************
* Procedure PostKeyEx32
*
* Parameters:
*  key    : virtual keycode of the key to send. For printable
*           keys this is simply the ANSI code (Ord(character)).
*  shift  : state of the modifier keys. This is a set, so you
*           can set several of these keys (shift, control, alt,
*           mouse buttons) in tandem. The TShiftState type is
*           declared in the Classes Unit.
*  specialkey: normally this should be False. Set it to True to
*           specify a key on the numeric keypad, for example.
* Description:
*  Uses keybd_event to manufacture a series of key events matching
*  the passed parameters. The events go to the control with focus.
*  Note that for characters key is always the upper-case version of
*  the character. Sending without any modifier keys will result in
*  a lower-case character, sending it with [ssShift] will result
*  in an upper-case character!
*Created: 17.7.98 by P. Below
************************************************************}
Type
   TShiftKeyInfo = Record
   shift: Byte;
   vkey : Byte;
   End;
   byteset = Set of 0..7;
Const
   shiftkeys: Array [1..3] of TShiftKeyInfo =
       ((shift: Ord(ssCtrl); vkey: VK_CONTROL ),
       (shift: Ord(ssShift); vkey: VK_SHIFT ),
       (shift: Ord(ssAlt); vkey: VK_MENU ));
Var
   flag: DWORD;
   bShift: ByteSet absolute shift;
   i: Integer;
Begin
   For i := 1 To 3 Do Begin
       If shiftkeys[i].shift In bShift Then
           keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
   End; { For }

   If specialkey Then
     flag := KEYEVENTF_EXTENDEDKEY
   Else
     flag := 0;

   keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
   flag := flag or KEYEVENTF_KEYUP;
   keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );

   For i := 3 DownTo 1 Do Begin
     If shiftkeys[i].shift In bShift Then
       keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0);
   End; { For }
End; { PostKeyEx32 }

function TForm1.WinExecAndWait32(FileName: String; Visibility: Integer): Integer;
{Esta función la utilicé hace tiempo para otra aplicación y creo que el código lo saqué
 del Club Delphi}
var
  zAppName: Array[0..512] of Char;
  zCurDir: Array[0..255] of Char;
  WorkDir: String;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  Resultado, ExitCode: DWord;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  CreateProcess(nil, zAppName, nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
    nil, nil, StartupInfo, ProcessInfo);

  repeat
    exitCode := WaitForSingleObject(ProcessInfo.hProcess,1000);
    Application.ProcessMessages;
  until (exitCode <> WAIT_OBJECT_0);

  GetExitCodeProcess(ProcessInfo.hProcess,Resultado);
  MessageBeep(0);
  CloseHandle(ProcessInfo.hProcess);
  Result := Resultado;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TextFile;
  H: HWND;
  I, J: Integer;
  C: Char;
  Genoma: Array of Char;
begin
  WinExecAndWait32(PChar('C:\VIENNA\RNAfold.exe'),SW_SHOWNORMAL);
  for J := 1 to 1443 do
  begin
    AssignFile(F, 'C:\GenomasGenerados\SinGenes\' + IntToStr(J) + '\GenomaInicial.txt');
    {Acá tengo la información que tengo que pasarle al programita RNAfold.exe, y que la paso
    mediante simmulación de teclado. Esta información la tengo guardada en archivos de texto,
    después la cargo a un array of char: Genoma, y mientras recorro este array simulo presión de
    teclas}
    try
      Reset(F);
    except
      CloseFile(F);
      Exit;
    end;
    SetLength(Genoma, 0);
    while not Eof(F) do
    begin
      Read(F, C);
      SetLength(Genoma, Length(Genoma) + 1);
      Genoma[High(Genoma)] := C;
    end;
    CLoseFile(F);
    H := FindWindow(Nil,'C:\VIENNA\RNAfold.exe');
    if H = 0 then ShowMessage('No se encontro la Aplicacion')
    else
    begin
      SetForegroundWindow(H);
      for I := Low(Genoma) to High(Genoma) do
        PostKeyEx32(Ord(Genoma[i]), [], False);
      repeat
        Application.ProcessMessages;
      until FileExists('C:\Erika\ICBME\Delphi y Vienna\rna.ps');
      {Esto es porque el programita me genera una gráfica en un erchivo de tipo ps. De todas
      formas no es esta la información que me interesa, lo que a mi me interesa es lo que el
      programa devuelve en PANTALLA}
    end;;
    LeerPantallaRNAFold {ESTO ES LO QUE ME FALTA Y NO SÉ COMO HACER!!!}
  end;
  H := FindWindow(Nil,'C:\VIENNA\RNAfold.exe');
    if H = 0 then ShowMessage('No se encontro la Aplicacion');
  SendMessage(H, WM_CLOSE, 0, 0);
end;

y lo que no puedo hacer es capturar los datos de salida que me da la aplicación rnafold.exe. Esta salida es de tipo stdout, es decir no me genera ningún archivo de salida.

Gracias por su ayuda!!!

Última edición por erika.martinez fecha: 27-03-2007 a las 18:36:00.
Responder Con Cita
  #7  
Antiguo 27-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por erika.martinez
Gracias seoane por tu respuesta. Lamentablemente no consigo adaptar el ejemplo que me diste a mi aplicación. Creo que el tema tiene que ver con el programita que yo ejecuto. Por ejemplo, para ejecutar este programita directamente desde command.com, tengo que poner todo el path: c:\vienna.rnafold.exe, no es una simple "instrucción?" como 'time'
Y probaste a pasarle todo el path a la función que te pase como ejemplo ???
Responder Con Cita
  #8  
Antiguo 27-03-2007
erika.martinez erika.martinez is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires - Argentina
Posts: 18
Poder: 0
erika.martinez Va por buen camino
Si, le pasé todo el path, y lo que obtengo es lo que puse en el mensaje #3
Responder Con Cita
  #9  
Antiguo 27-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Buffer es una variable interna, entiendo entonces que colocas un breakpoint y examinas su contenido ¿cuando lo haces? ¿en que instrucción lo haces?
Responder Con Cita
  #10  
Antiguo 27-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
seoane:
Lo que veo es que en CreateProcess le asignas la salida al primer pipe.
Pena; no tengo ningún programa DOS a mano para probarlo.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
leer cadena de otra aplicacion jar OOP 2 05-02-2007 20:18:12
Utilizar un DBGrid para leer de una tabla y escribir en otra taru MySQL 0 25-07-2006 18:31:06
Pasar texto de una aplicacion delphi a otra OmarPerez API de Windows 4 13-07-2005 20:56:19
Leer texto de un txt Walterdf Varios 1 07-05-2003 14:35:36


La franja horaria es GMT +2. Ahora son las 17:06:55.


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
Copyright 1996-2007 Club Delphi