Fórum Pegar retorno do gfix pelo delphi? #404961

14/07/2011

0

Saudaçoes,

Gostaria de saber se eh possivel atraves do delphi pegar o retorno de erro resultante da execuçao do gfix. O que gostaria de fazer eh executar o gfix antes de realizar o backup do banco e caso algum problema seja detectado avisar o usuario.

Obs: Não posso usar componentes tipo IBValidationService

Grato
Adriano Dolce

Adriano Dolce

Responder

Posts

15/07/2011

Adriano Dolce

Saudaçoes,

Gostaria de saber se eh possivel atraves do delphi pegar o retorno de erro resultante da execuçao do gfix. O que gostaria de fazer eh executar o gfix antes de realizar o backup do banco e caso algum problema seja detectado avisar o usuario.

Obs: Não posso usar componentes tipo IBValidationService

Grato
Sobe
Responder

Gostei + 0

15/07/2011

Deivison Melo

O que você precisa é pegar AS informações que são exibidas no prompt de comando (DOS). Achei essa função na net, testa com ela!! Function SaidaDoCMD(Comando:String):String;
var
  Security: TSecurityAttributes;
  ReadPipe,WritePipe:THandle;
  Start:TStartUpInfo;
  ProcessInfo:TProcessInformation;
  BytesReadWord;
  Buffer:PChar;
begin
  Security.nLength:=SizeOf(TSecurityAttributes);
  Security.bInheritHandle:=True;
  Security.lpSecurityDescriptor:=nil;
  if CreatePipe(ReadPipe,WritePipe,@Security,0)then
  try
    GetMem(Buffer,2400);
    FillChar(Buffer^,2400,0);
    FillChar(start,SizeOf(start),#0);
    start.cb:=SizeOf(start);
    start.dwFlags:=257;
    start.hStdOutput:=WritePipe;
    if CreateProcess(nil,PChar(Comando),@Security,@Security,True,32,nil,nil,start,ProcessInfo)then begin
    repeat
    ReadFile(ReadPipe,Buffer[0],2400,BytesRead,nil);
    Result:=Result+String(Buffer);
    until BytesRead<2400;
    end;
    FreeMem(Buffer);
  finally
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;
Exemplo de uso: ServerSocket1.Socket.SendText(SaidaDoCMD('netstat -abn')); PS. Os créditos dessa função não são meus!!!!
Responder

Gostei + 0

15/07/2011

Adriano Dolce

O que você precisa é pegar AS informações que são exibidas no prompt de comando (DOS). Achei essa função na net, testa com ela!! Function SaidaDoCMD(Comando:String):String;
var
  Security: TSecurityAttributes;
  ReadPipe,WritePipe:THandle;
  Start:TStartUpInfo;
  ProcessInfo:TProcessInformation;
  BytesReadWord;
  Buffer:PChar;
begin
  Security.nLength:=SizeOf(TSecurityAttributes);
  Security.bInheritHandle:=True;
  Security.lpSecurityDescriptor:=nil;
  if CreatePipe(ReadPipe,WritePipe,@Security,0)then
  try
    GetMem(Buffer,2400);
    FillChar(Buffer^,2400,0);
    FillChar(start,SizeOf(start),#0);
    start.cb:=SizeOf(start);
    start.dwFlags:=257;
    start.hStdOutput:=WritePipe;
    if CreateProcess(nil,PChar(Comando),@Security,@Security,True,32,nil,nil,start,ProcessInfo)then begin
    repeat
    ReadFile(ReadPipe,Buffer[0],2400,BytesRead,nil);
    Result:=Result+String(Buffer);
    until BytesRead<2400;
    end;
    FreeMem(Buffer);
  finally
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;
Exemplo de uso: ServerSocket1.Socket.SendText(SaidaDoCMD('netstat -abn')); PS. Os créditos dessa função não são meus!!!!
Muito obrigado amigo, mais não deu certo não, travou aqui e não executou.

Para que quiser testar mudar esta linha aqui BytesReadWord; por BytesRead: DWord;
Responder

Gostei + 0

12/02/2012

Euler

Galera, o código acima realmente não funciona se você executar direto.
Mas se se você executar debugando ele funciona. Dica.

Coloca um Sleep(1000) pra dar um tempo de um segundo pra ele pegar o retorno.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar