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.
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
Curtir tópico
+ 0
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:
2) Modificando para que retornasse o codigo de saida do processo:
E funcionou como o desejado.
Te +
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
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 ?
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
Clique aqui para fazer login e interagir na Comunidade :)