Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2008
Avatar de Negriz
Negriz Negriz is offline
Miembro
 
Registrado: feb 2008
Ubicación: Some were inside Colombia
Posts: 123
Poder: 17
Negriz Va por buen camino
una mas, capturar el resultado del system()

ho,a como estan...
esta nueva pregutna es para saber si puedo guardar en una variable el resultado de los comandos que ejecuto desde system(); para ser mas claro supongamos que uso al presionar un boton:

Cita:
system("dir C:")
esto me mostraria abriria una consola diciendo algo mas o menos asi:



bueno lo que quiero saber es que si el resultado de ese dir, osea el listado de directorios que muestra puede ser alamacenado en una variable o algo asi...

Gracias
Responder Con Cita
  #2  
Antiguo 08-11-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Esto lo puedes abordar "redireccionando"... por ejemplo abre la consola y pega ésto:

Código:
dir %systemroot%\*.* /s /b > %temp%\filelist.txt&notepad %temp%\filelist.txt
El anterior ejemplo te guarda en un archivo el resultado del comando "dir" y lo abre con el Bloc de notas.

Tambien puedes revisar ésto.

Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #3  
Antiguo 08-11-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
También te resultará interesante.

Saludos.
Responder Con Cita
  #4  
Antiguo 08-11-2008
Avatar de Negriz
Negriz Negriz is offline
Miembro
 
Registrado: feb 2008
Ubicación: Some were inside Colombia
Posts: 123
Poder: 17
Negriz Va por buen camino
ya habia pensado en lo del TXT pero me parecio interesnte preguntar acerca de metodos alternativos...

Muhas gracias, aunqeu no soy muy bueno en delphi esto me ayuda a comprender y aprender un poco mas del enguaje voy a mirar y muchas gracias de nuevo .
Responder Con Cita
  #5  
Antiguo 12-11-2008
Avatar de Negriz
Negriz Negriz is offline
Miembro
 
Registrado: feb 2008
Ubicación: Some were inside Colombia
Posts: 123
Poder: 17
Negriz Va por buen camino
hola...
encontre "GetDosOutput" pero no encontre como utilizarla en c++ Builder...

tambien utilize: system( "taskkill /M taskmgr.exe > %tmp%//kill.txt" );
y funciona bien pero me muestra la consola, cosa que no deseo....
despues utilize:
ShellExecute(0, "open", "taskkill","/IM taskmgr.exe", "%SystemDir%//System32", SW_HIDE);
no se como capturar el resultado, es ceri no se donde poner "> %tmp%//kill.txt" ya que es un comando mas.
despues intente con:
WinExec( "taskkill /M taskmgr.exe > %tmp%//kill.txt", SW_HIDE)
modifique SW_HIDE por SW_NORMAL para poder ver el resultado y me decia que los parametros eran incorrectos...

entonces mi pregunta es como hago esto con shellexecute o WinExec para que funcione ya que estos dos me dejan esconder la consola de commandos

Gracias.

Última edición por Negriz fecha: 12-11-2008 a las 01:10:41.
Responder Con Cita
  #6  
Antiguo 12-11-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Crea un archivo que se llame consoleoutput.pas
En él escribe:

Código Delphi [-]
  
unit consoleoutput;

interface

uses
  Controls, Windows, SysUtils, Forms;

function GetDosOutput(CommandLine:string): string;
function ExecuteDOSCommand(CommandLine:string): string;

//---------------------------------------------------------------------------
implementation
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Ejecuta y devuelve el resultado de un comando DOS o de consola
// sin usar la ruta específica del mismo
// No se pueden ejecutar procesos que no sean del S.O.
function ExecuteDOSCommand(CommandLine:string): string;
var
  cmdbuffer: Array [0..MAX_PATH] of Char;

begin
  GetEnvironmentVariable( 'COMSPEC', cmdBUffer, Sizeof(cmdBuffer));
  CommandLine := cmdbuffer + ' /C ' + CommandLine;
//  Result := (CommandLine);
  Result := GetDosOutput(CommandLine);
end;

//---------------------------------------------------------------------------
// Ejecuta y devuelve el resultado de un proceso por linea de comandoso de consola
// Necesita la ruta especifica del proceso
function GetDosOutput(CommandLine:string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir, Line: String;
begin
  Application.ProcessMessages;
  with SA do
  begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  // create pipe for standard output redirection
  CreatePipe(StdOutPipeRead,  // read handle
             StdOutPipeWrite, // write handle
             @SA,             // security attributes
             0                // number of bytes reserved for pipe - 0 default
             );
  try
    // Make child process use StdOutPipeWrite as standard out,
    // and make sure it does not show on screen.
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect std input
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;

    // launch the command line compiler
    WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI);

    // Now that the handle has been inherited, close write to be safe.
    // We don't want to read or write to it accidentally.
    CloseHandle(StdOutPipeWrite);
    // if process could be created then handle its output
    if not WasOK then
      raise Exception.Create('Could not execute command line!')
    else
      try
        // get all output until dos app finishes
        Line := '';
        repeat
          // read block of characters (might contain carriage returns and line feeds)
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);

          // has anything been read?
          if BytesRead > 0 then
          begin
            // finish buffer to PChar
            Buffer[BytesRead] := #0;
            // combine the buffer with the rest of the last run
            Line := Line + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        // wait for console app to finish (should be already at this point)
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        // Close all remaining handles
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
      result:=Line;
      CloseHandle(StdOutPipeRead);
  end;
end;


end.

Añádelo a tu proyecto Builder y compílalo por separado. Generará un archivo llamado consoleoutput.hpp, es la cabecera de las dos funciones.

Incluye esa cabecera en las unidades .cpp donde quieras usar las funciones, y compila.

Saludos.
Responder Con Cita
  #7  
Antiguo 13-11-2008
Avatar de Negriz
Negriz Negriz is offline
Miembro
 
Registrado: feb 2008
Ubicación: Some were inside Colombia
Posts: 123
Poder: 17
Negriz Va por buen camino
no sabia que eso se podia hacer...

mira funciona bien lo que me digiste, me crea el hpp pero hay un prblema,
la funcion ExecuteDOSCommnad no pueed ejecutar mas de un comando, ejemplo help>c:/a.txt produce una excepcion y la funcion GetDosOutput no funciona con ningun cmando... Que puedo hacer.?
Responder Con Cita
  #8  
Antiguo 14-11-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Esas funciones devuelven un Sring, de forma que no te hace falta redireccionar el flujo a un archivo de texto, que creo era la idea original. Tu programa lee directamente el resultado en una cadena:

Código:
AnsiString Help = ExecuteDOSCommand("help");
Carga en Help el resultado del comando help
Para cada comando, una llamada nueva.
Tiene ciertas limitaciones y se puede mejorar....

ExecuteDOSCommand Sólo ejecuta comandos del Sistema Operativo, y no precisa de la ruta completa del comando.

GetDosOutput requiere la ruta completa del proceso a ejecutar. Es utlizada por ExecuteDOSCommand para llamar al comando requerido.

Saludos.
Responder Con Cita
  #9  
Antiguo 14-11-2008
Avatar de Negriz
Negriz Negriz is offline
Miembro
 
Registrado: feb 2008
Ubicación: Some were inside Colombia
Posts: 123
Poder: 17
Negriz Va por buen camino
Muchas Gracias... :D:D:D

Entiendo, (no puedo creer que no la haya pillado ) no tengo que usar GetDosCommand

muchas gracias por la ayuda.
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
Out of system resources Khronos Varios 7 11-07-2008 12:54:20
Out of system resources johurgi Varios 5 04-06-2008 15:54:34
System Gym novato03 Varios 7 22-10-2007 22:07:06
Como capturar el resultado de una consulta SQL Jose Manuel SQL 9 15-10-2005 12:40:37
driver not known to system? maruenda Varios 0 25-03-2004 15:25:30


La franja horaria es GMT +2. Ahora son las 11:33:23.


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