Pegar retorno do gfix pelo delphi?

Delphi

14/07/2011

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

Curtidas 0

Respostas

Adriano Dolce

Adriano Dolce

14/07/2011

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
GOSTEI 0
Deivison Melo

Deivison Melo

14/07/2011

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!!!!
GOSTEI 0
Adriano Dolce

Adriano Dolce

14/07/2011

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;
GOSTEI 0
Euler

Euler

14/07/2011

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.
GOSTEI 0
POSTAR