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 02-09-2004
luigidean luigidean is offline
Miembro
 
Registrado: ago 2004
Posts: 22
Poder: 0
luigidean Va por buen camino
No se lo que estoy haciendo mal pero me sigue sin funcionar. Lo que yo tengo en mi programa es esto:

ShellExecute(form1.Handle,'Open','c:\winnt\system32\cmd.exe /c dir >prueba.txt',nil,nil,SW_HIDE);

He buscado el fichero prueba.txt por el disco duro y no aparece por ningun lado.

saludos
Responder Con Cita
  #2  
Antiguo 02-09-2004
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
En la función ShellExecute el nombre del ejecutable y los parámetros se pasan por separado. La forma correcta seria la siguiente:

Código Delphi [-]
ShellExecute(handle,nil,'cmd.exe','/c dir >c:\prueba.txt',nil,SW_HIDE);

Hasta luego
Responder Con Cita
  #3  
Antiguo 02-09-2004
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
Estaba echándole otro vistazo a este hilo, y si lo que se quería al principio era recoger la salida de un programa, se puede hacer sin usar el interprete de comandos para que redirija su salida a un archivo y luego leer ese archivo.

Aquí os dejo un ejemplo de cómo recoger la salida del comando dir y colocarla en un Tmemo. En el formulario debe de haber un boton y un memo llamado memo1.

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

procedure TForm1.Button1Click(Sender: TObject);
var
  buf: array[0..4095] of byte;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin,newstdout,read_stdout,write_stdin: THandle;
  exitcod,bread,avail: Cardinal;
begin
  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;
  // Tuberias
  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(buf,sizeof(buf),0);
    GetEnvironmentVariable('COMSPEC',@buf,sizeof(buf)-1);
    strcat(@buf,' /c dir');
    if CreateProcess(nil,@buf,nil,nil,TRUE,CREATE_NEW_CONSOLE,nil,nil,si,pi) then
    begin
      memo1.lines.Clear;
      GetExitCodeProcess(pi.hProcess,exitcod);
      PeekNamedPipe(read_stdout,@buf,sizeof(buf)-1,@bread,@avail,nil);
      while (exitcod = STILL_ACTIVE) or (bread > 0) do 
      begin
        if (bread > 0) then 
        begin
          fillchar(buf,sizeof(buf),0);
          if (avail > sizeof(buf)-1) then
            while (bread >= sizeof(buf)-1)  do
            begin
              ReadFile(read_stdout,buf,sizeof(buf)-1,bread,nil);
              memo1.lines.text := memo1.lines.Text + StrPas(@buf);
              fillchar(buf,sizeof(buf),0);
            end
            else
            begin
              ReadFile(read_stdout,buf,sizeof(buf)-1,bread,nil);
              memo1.lines.text := memo1.lines.Text + StrPas(@buf);
            end;
          end;
          GetExitCodeProcess(pi.hProcess,exitcod);
          PeekNamedPipe(read_stdout,@buf,sizeof(buf)-1,@bread,@avail,nil);
        end;
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;

Hasta luego

Última edición por dec fecha: 21-03-2007 a las 23:04:13.
Responder Con Cita
  #4  
Antiguo 13-09-2004
verm83 verm83 is offline
Miembro
 
Registrado: nov 2003
Posts: 28
Poder: 0
verm83 Va por buen camino
Este código que nos muestra seoane es muy válido, y funciona a la perfección, pero intento darle una pequeña vuelta de tuerca, y no sé cómo. Me explico: el programa muestra en el memo la salida del comando msdos, pero una vez éste acabado. Mi intención era mostrar en tiempo real lo que devuelve el comando, al igual que parar la ejecución del mismo en caso de no interesarme su ejecución.

¿Alguien podría echarme un cable?

Gracias anticipadas
__________________
IncestoCanibal.com
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


La franja horaria es GMT +2. Ahora son las 06:19:38.


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