Fórum Capturar ERRO GBAK com CreateProcess #51150

25/05/2005

0

Colegas,

Estou desenvolvendo uma interface para backup chamando o GBAK de dentro da minha aplicacao delphi.

Estou utilizando CreateProcess para chamar o GBAK passando os parametros necessarios. ate ai tudo bem. So que preciso capturar os erros retornados pelo gbak caso encontre algum problema.

CreateProcess me parece que somente retorna erros se a chamada ao gbak falhar (tipo se o gbak.exe não for localizado), e preciso capturar o erro retornado pelo gbak (tipo se o usuario ou senha forem invalidos, etc).

Ate que para testar se o backup foi realizado corretamente eu poderia testar a existencia do arquivo de backup (se existir o backup foi realizado com sucesso e senão o backup falhou).

O problema e quando for tentar restaurar um backup sobrepondo um banco de dados que ja existe, e por exemplo usuarios estiverem conectados ao banco impedindo que a restauracao do mesmo. Neste caso o gbak nao restaura o backup e CreateProcess nao retorna nenhum erro. Logo precisaria de testar (se houver como) um codigo de erro retornado pelo gbak para createprocess.

Alguem sabe se isso e possivel?

Obrigado a todos.


Sergiomatos

Sergiomatos

Responder

Post mais votado

25/05/2005

Bom amigos,

Já consegui resolver da seguinte forma:

1) Achei no forum o seguinte codigo para criar um processo:

{ **** Executa um processo **** }
function ExecProcess(FileName, Params: String; WindowState: Word; ProcessName: String = ´´; Wait: Boolean = True): Boolean;
var SI: TStartupInfo;
    PI: TProcessInformation;
    CmdLine: String;
    Status: Cardinal;
begin
  CmdLine:= FileName + ´ ´ + Params;
  FillChar(SI, SizeOf(SI), #0);
  with SI do
    begin
      cb:= SizeOf(SI);
      dwFillAttribute:= FOREGROUND_RED;
      if ProcessName <> ´´ then lpTitle:= PChar(ProcessName);
      wShowWindow:= WindowState;
      dwFlags:= STARTF_USESHOWWINDOW + STARTF_USEFILLATTRIBUTE;
    end;
  Result:= CreateProcess( nil, PChar(CmdLine), nil, nil, False,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(FileName)), SI, PI
                         );
  if Result then
    begin
      if Wait then
        WaitForSingleObject(PI.hProcess, INFINITE);

      {***********************************************}
      {alteração para capturar o codigo retornado pelo processo}
      {***********************************************}
      GetExitCodeProcess(PI.hProcess, status);
      Result := Status = 0;
      {***********************************************}

      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
const
  gbak = ´c:\arquivos de programas\firebird\bin\gbak.exe´;
var
  gParams: String;
  Sucessfull: boolean;
begin

  gParams:= ´-b -v -y ´  + ´"´ + edt_LogFile.Text + ´"´ +  ´ ´ +
            ´-user ´     + edt_usuario.Text + ´ ´ +
            ´-password ´ + edt_senha.Text   + ´ ´ +
            ´"´ + edt_DatabaseFile.Text  + ´"´ + ´ ´ +
            ´"´ + edt_BackupFile.Text    + ´"´;
  { **** }

  if fileexists(edt_backupfile.Text) then
     DeleteFile(edt_backupfile.Text);

  if fileexists(edt_logfile.Text) then
     DeleteFile(edt_logfile.Text);

  SucessFull := ExecProcess(gbak, gParams, SW_HIDE,´Back-Up´);
  memobackuplog.Lines.LoadFromFile(edt_logfile.text);

  if Sucessfull then
     ShowMessage(´Backup completado com SUCESSO.´)
  else ShowMessage(´Backup completado com ERROS.´)

  { **** }
end;



2) Modificando para que retornasse o codigo de saida do processo:

      GetExitCodeProcess(PI.hProcess, status);
      Result := Status = 0;


E funcionou como o desejado.

Te +


Sergiomatos

Sergiomatos
Responder

Gostei + 1

Mais Posts

13/09/2010

Thiago Pedro

Queria te dar os parabéns pelo código.
Só uma dúvida.
Qual seria na realidade a funcionalidade do código:

{***********************************************}
{alteração para capturar o codigo retornado pelo processo}
{***********************************************}
GetExitCodeProcess(PI.hProcess, status);
Result := Status = 0;
{***********************************************}


Em que é aplicável ?
Responder

Gostei + 0

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

Aceitar