Aguardar ShellExecute terminar Cópia
21/03/2014
0
Seguinte, eu criei uma aplicação com serviço do Windows, para fazer um backup automático, utilizei serviço porque os servidores não são monitorados (ninguém faz logon). Logo para conseguir copiar os arquivos estou usando o ShellExecute, após a cópia, eu compacto, porem não estou conseguindo fazer com que o Delphi aguarde a finalização do ShellExecute para executar o próximo procedimento.
Como faço para fazer o Delphi aguardar a finalização da Cópia?
Meu código:
procedure Copia(Origem, Destino: String); var Parametros: Pchar; I: integer; begin try Parametros := Pchar('"' + Origem + '" "' + Destino + '" /S /Y '); I:=ShellExecute(0, '', 'xCopy', Parametros, '', SW_SHOW); Except on E:Exception do GeraLog('Erro ao copiar: '+E.Message); end; end;
Rawgleison
Post mais votado
21/03/2014
function ShellExecuteAndWait(Operation, FileName, Parameter, Directory: String; Show: Word; bWait: Boolean): Longint; var bOK: Boolean; Info: TShellExecuteInfo; begin FillChar(Info, SizeOf(Info), Chr(0)); Info.cbSize := SizeOf(Info); Info.fMask := SEE_MASK_NOCLOSEPROCESS; Info.lpVerb := PChar(Operation); Info.lpFile := PChar(FileName); Info.lpParameters := PChar(Parameter); Info.lpDirectory := PChar(Directory); Info.nShow := Show; bOK := Boolean(ShellExecuteEx(@Info)); if bOK then begin if bWait then begin while WaitForSingleObject(Info.hProcess, 100) = WAIT_TIMEOUT do Application.ProcessMessages; bOK := GetExitCodeProcess(Info.hProcess, DWORD(Result)); end else Result := 0; end; if not bOK then Result := -1; end;
uso:
procedure Copia(Origem, Destino: String); var Parametros: Pchar; I: integer; begin try Parametros := Pchar('"' + Origem + '" "' + Destino + '" /S /Y '); I := ShellExecuteAndWait('open', 'xCopy', Parametros, '', SW_SHOW, True); Except on E:Exception do GeraLog('Erro ao copiar: '+E.Message); end; end;
Alan Souza
Mais Posts
22/03/2014
Rawgleison
[RESOLVIDO]
25/03/2014
Rawgleison
26/12/2019
Felipe
function ShellExecuteAndWait(Operation, FileName, Parameter, Directory: String; Show: Word; bWait: Boolean): Longint; var bOK: Boolean; Info: TShellExecuteInfo; begin FillChar(Info, SizeOf(Info), Chr(0)); Info.cbSize := SizeOf(Info); Info.fMask := SEE_MASK_NOCLOSEPROCESS; Info.lpVerb := PChar(Operation); Info.lpFile := PChar(FileName); Info.lpParameters := PChar(Parameter); Info.lpDirectory := PChar(Directory); Info.nShow := Show; bOK := Boolean(ShellExecuteEx(@Info)); if bOK then begin if bWait then begin while WaitForSingleObject(Info.hProcess, 100) = WAIT_TIMEOUT do Application.ProcessMessages; bOK := GetExitCodeProcess(Info.hProcess, DWORD(Result)); end else Result := 0; end; if not bOK then Result := -1; end;
uso:
procedure Copia(Origem, Destino: String); var Parametros: Pchar; I: integer; begin try Parametros := Pchar('"' + Origem + '" "' + Destino + '" /S /Y '); I := ShellExecuteAndWait('open', 'xCopy', Parametros, '', SW_SHOW, True); Except on E:Exception do GeraLog('Erro ao copiar: '+E.Message); end; end;
O que seria a origem e o destino nã tendi muito bem o algoritmo
27/12/2019
Natanael Ferreira
function ShellExecuteAndWait(Operation, FileName, Parameter, Directory: String; Show: Word; bWait: Boolean): Longint; var bOK: Boolean; Info: TShellExecuteInfo; begin FillChar(Info, SizeOf(Info), Chr(0)); Info.cbSize := SizeOf(Info); Info.fMask := SEE_MASK_NOCLOSEPROCESS; Info.lpVerb := PChar(Operation); Info.lpFile := PChar(FileName); Info.lpParameters := PChar(Parameter); Info.lpDirectory := PChar(Directory); Info.nShow := Show; bOK := Boolean(ShellExecuteEx(@Info)); if bOK then begin if bWait then begin while WaitForSingleObject(Info.hProcess, 100) = WAIT_TIMEOUT do Application.ProcessMessages; bOK := GetExitCodeProcess(Info.hProcess, DWORD(Result)); end else Result := 0; end; if not bOK then Result := -1; end;
uso:
procedure Copia(Origem, Destino: String); var Parametros: Pchar; I: integer; begin try Parametros := Pchar('"' + Origem + '" "' + Destino + '" /S /Y '); I := ShellExecuteAndWait('open', 'xCopy', Parametros, '', SW_SHOW, True); Except on E:Exception do GeraLog('Erro ao copiar: '+E.Message); end; end;
O que seria a origem e o destino nã tendi muito bem o algoritmo
Neste caso que está fazendo uma cópia:
Origem = Caminho completo do arquivo que será copiado
Destino = Caminho completo onde salvará o novo arquivo copiado
Exemplo, copiando o arquivo teste.txt da Pasta1 para Pasta2:
Copia('C:\\Pasta1\\teste.txt', 'C:\\Pasta2\\teste.txt')
02/07/2020
Maiquel Parisotto
O único problema é que a tela chamada externa não fica em frente ao programa em execução, ela fica por trás.
Alguém sabe o porque?
13/03/2023
Sismais Tecnologia
function ShellExecuteAndWait(AHandle: HWND; Operation, ... ... Info.lpFile := PChar(FileName); Info.Wnd := AHandle; //<<< Aqui. ...
Clique aqui para fazer login e interagir na Comunidade :)