Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Pegar ExitCode do processo


Douglas Soares

Pergunta

Bom dia pessoal, utilizo essa procedure para executar comandos de MS-DOS e joga-los num RichEdit, porém eu preciso gravar um log num dbgrid dizendo se a função foi executada corretamente ou não... gostaria de obter tipo um código 0 pra falso ou 1 pra true, como faço isso?

procedure TfrmPrincipal.CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TRichEdit);
 const
   CReadBuffer = 2400;
 var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of Char;
   dRead: DWord;
   dRunning: DWord;
 begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;

   if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin    
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;    
     suiStartup.wShowWindow := SW_HIDE;

     if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
       @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
       then
     begin
       repeat
         dRunning  := WaitForSingleObject(piProcess.hProcess, 100) ;
         Application.ProcessMessages();
         repeat
           dRead := 0;
           ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
           pBuffer[dRead] := #0;
           AMemo.Lines.Add(String(pBuffer));
         until (dRead < CReadBuffer);
       until (dRunning <> WAIT_TIMEOUT);
       CloseHandle(piProcess.hProcess);
       CloseHandle(piProcess.hThread);
     end;
     ShowMessage();

     CloseHandle(hRead);
     CloseHandle(hWrite);
   end;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

CaptureConsoleOutput('iscc "C:\Script.iss"', ''; RichEdit1);

ISCC é o o compilador do inno setup.

http://www.downloadatoz.com/utility_direct...ilercmdline.htm

Pra testar é só abrir um script e colocar pra compilar e em seguida colocar pra compilar no delphi pra simular o erro, queria dar uma mensagem no delphi quando ele der erro, o erro seria que o processo já está sendo usado, porém não consigo saber isso através dessa função.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia pessoal, utilizo essa procedure para executar comandos de MS-DOS e joga-los num RichEdit, porém eu preciso gravar um log num dbgrid dizendo se a função foi executada corretamente ou não... gostaria de obter tipo um código 0 pra falso ou 1 pra true, como faço isso?

Basta testar a variavel dRunning

procedure CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TRichEdit);
const
   CReadBuffer = 2400;
var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of Char;
   dRead: DWord;
   dRunning: DWord;
begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;

   if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin    
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;    
     suiStartup.wShowWindow := SW_HIDE;

     if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
       @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
       then
     begin
       repeat
         dRunning  := WaitForSingleObject(piProcess.hProcess, 100);
         Application.ProcessMessages();
         repeat
           dRead := 0;
           ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
           pBuffer[dRead] := #0;
           AMemo.Lines.Add(String(pBuffer));
         until (dRead < CReadBuffer);
       until (dRunning <> WAIT_TIMEOUT);

       CloseHandle(piProcess.hProcess);
       CloseHandle(piProcess.hThread);

       if (dRunning <> WAIT_TIMEOUT) and (dRunning = 0) then
          ShowMessage('Comando executado corretamente')
       else
          ShowMessage('Comando executado incorretamente')
     end;

     CloseHandle(hRead);
     CloseHandle(hWrite);
   end;
end;

OBS: Onde aparece a mensagem voce pode jogar valores 0 ou 1 para uma tabela e apresenta-los em um dbgrid

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Opa! Transformei em função porem só retorna true, mesmo o erro aparecendo na tela que alguém está usando o processo... ele deveria jogar no dbgrid que deu erro porém ele joga que deu certo pois a função retorna true de qualquer jeito... o que será que tá acontecendo?

function TfrmPrincipal.CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TRichEdit) : Boolean;
const
   CReadBuffer = 2400;
var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of Char;
   dRead: DWord;
   dRunning: DWord;
begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;

   if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
     suiStartup.wShowWindow := SW_HIDE;

     if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
       @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
       then
     begin
       repeat
         dRunning  := WaitForSingleObject(piProcess.hProcess, 100);
         Application.ProcessMessages();
         repeat
           dRead := 0;
           ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
           pBuffer[dRead] := #0;
           AMemo.Lines.Add(String(pBuffer));
         until (dRead < CReadBuffer);
       until (dRunning <> WAIT_TIMEOUT);

       CloseHandle(piProcess.hProcess);
       CloseHandle(piProcess.hThread);

       if (dRunning <> WAIT_TIMEOUT) and (dRunning = 0) then
          result := true
       else
          result := false;
     end;

     CloseHandle(hRead);
     CloseHandle(hWrite);
   end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Ahhh consegui!

Declarei uma variavel na função chamada ExitCode : DWORD;

e então setei um valor nela assim:

GetExitCodeProcess(piProcess.hProcess, ExitCode);

Daí peguei o exit code e joguei no result :P

Vlw pela ajuda Jhonas

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...