Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Ejecutar comando y capturar su salida (https://www.clubdelphi.com/foros/showthread.php?t=80452)

seoane 09-06-2006 11:38:22

Ejecutar comando y capturar su salida
 
Esta funcion nos permite ejecutar un comando como si nos encontraramos en una consola de DOS, y captura la salida en un string.

Código Delphi [-]
function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;

function CmdExec(Cmd: string): string;
var
  Buffer: array[0..4096] of Char;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
begin
  Result:= '';
  if IsWinNT then
  begin
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end
  else sa.lpSecurityDescriptor := nil;
  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := TRUE;
  if CreatePipe(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;
        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + Cmd));
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        repeat
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + String(PChar(@Buffer));
          end;
          Application.ProcessMessages;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;

Ejemplo de uso:
Código Delphi [-]
  ShowMessage(CmdExec('dir c:\'));
  ShowMessage(CmdExec('netstat -a -n'));

dec 10-06-2006 22:39:37

Qué bueno Seoane. ;)

JGCG 28-04-2007 08:58:20

Gracias!!! por el truco lo voy probar

f.gimeno 19-09-2008 03:17:17

Magistral!
Domingo: Tu programa me ha venido de perlas. Estoy ultimando un programa de ajedrez que llama a Crafty y gracias a tu "invento" consigo leer lo que Crafty da (funciona como una consola) pero no consigo enviarle mensajes ("ordenes") por el pipe.
Se te ocurre cómo hacerlo??
¿Me puedes contestar a xxxxxxxxxxx?
Creo que si no lo resuelvo me va da algo...

jgutti 29-09-2013 07:03:56

como ejecutar esta función con permisos de adminstrador en Windows 7, si paso como parámetros un archivo .bat

saludos
jgutti

nlsgarcia 30-09-2013 17:30:16

jgutti,

Cita:

Empezado por jgutti
...¿Como ejecutar esta función con permisos de Administrador en Windows 7?...

Revisa el Msg #2 de este link:
Cita:

Ejecutar aplicación como Administrador en Windows 7 : http://www.clubdelphi.com/foros/show...ght=RunAsAdmin
Espero sea útil :)

Nelson.

dandyuno 07-11-2017 10:40:13

Saludos, he probado este codigo del truco en un memo, el resultado no es el esperado ya que el comando que envio es 'dir' y el resultado es 䔠潶畬敭敤氠⁡湵摩摡䌠渠楴湥⁥瑥煩敵慴മ
䔠ꍮ敭潲搠⁥敳楲⁥敤潶畬敭獥›䍁㔱㈭䑂റഊ
䐠物捥潴楲敤䌠尺獕牥屳慤摮畹潮䑜捯浵湥獴停潲敪瑣牐敵慢൳ഊ
㜰ㄯ⼱〲㜱†㠰㈺‶†㰠䥄㹒†††††മ
㜰ㄯ⼱〲㜱†㠰㈺‶†㰠䥄㹒†††††⸮਍㜰ㄯ⼱〲㜱†〱㌺″†††††ㄠ⸲〴‰牐湩楣慰⹬捤൵《⼷ㄱ㈯㄰‷〠㨸㘲††††††㈠㜮㌲倠楲据灩污搮浦਍㜰ㄯ⼱〲㜱†㠰㈺‶††††††⸲㌶‴牐湩楣慰⹬ 慰൳
ㄱㄯ⼰〲㜱†㈱㌺‷†††††††㌲‷牐敵慢⹳灤൲
ㄱㄯ⼰〲㜱†㈱㔺′††††††⸵㤶‱牐敵慢⹳灤潲൪

¿que es lo que ocurre? ¿que he hecho mal? Gracias

Casimiro Notevi 07-11-2017 11:04:21

Cita:

Empezado por dandyuno (Mensaje 522314)
Ella 䔠  Hei Ke Yang Shen ⁡ Usted  fricción Xi 䌠 canal de  Titu ⁥ Wenfandishe മ 䔠 ꍮ pigwash Yang Ke apuñaló ⁥ Aiwei ⁥  Hei Ella Yang Jiao > 䍁 㔱 ㈭ 䑂 റഊ 䐠 retención fue Wan Wei Ke  䌠 Chicuifangxian Queqiaowanchao 䑜 Daotongtumeng Tingshaoduosuo  Zha enemigo lenta ൳ഊ 㜰 ㄯ ⼱ 〲 㜱 † 㠰 ㈺ "† 㰠 䥄 㹒 ††††† മ 㜰 ㄯ ⼱ 〲 㜱† 㠰 ㈺ "† 㰠 䥄 㹒 ††††† ⸮਍ 㜰 ㄯ ⼱ 〲 㜱 † 〱㌺" ††††† ㄠ ⸲〴 ‰ Zhadongmeiwei ⹬ Wei ൵ "⼷ ㄱ ㈯ ㄰ ‷ 〠 㨸 㘲 † ††††† i 㜮 ㌲ Suiwei Se Yanwulipu ਍ 㜰 ㄯ ⼱ 〲 㜱 † 㠰 ㈺ "†††††† ⸲㌶ '' 'Zhatongmeiwei ⹬ comodidad ൳ ㄱ ㄯ ⼰ 〲 㜱 † ㈱㌺ ‷ ‷ Zha ††††††† ㌲ enemigo lenta ⹳ Luan ൲ ㄱ ㄯ ⼰ 〲 㜱 † ㈱ 㔺 '‱ Zha †††††† ⸵ 㤶 enemigo lenta ⹳ Luan pigwash 4

A saber qué webs visitas :p

dandyuno 07-11-2017 11:22:53

Muy buenas Casimiro, la web de donde saque el codigo es esta, y fue un copy paste para ver su funcionamiento. Utilizo Embarcadero 2010

Casimiro Notevi 07-11-2017 11:26:45

Seguramente tengas que modificar el código y cambiar los char por ansichar, los string por ansistring, etc. por el tema del unicode.

dandyuno 07-11-2017 12:08:28

OK Casimiro, ahora si que funciona, tan solo tiene un pequeño detalle, cuando mando por ej ShowMessage('dir'); la primera vez sale en blanco, pero la segunda sale perfecto por lo demas lo que buscaba, muchas gracias por tu ayuda


La franja horaria es GMT +2. Ahora son las 11:34:06.

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