Hola lgarcia.
Si entendí bien, deseas copiar otra version de la aplicación llamando desde esta misma a un actualizador que sobreescribirá una nueva versión de la misma.
El problema es, que mientras la aplicación se esté ejecutando, el s.o. no permitirá que sobreescribas su archivo ejecutable. Y por otro lado, no veo manera que la aplicación ejecute al actualizador cuando no se está ejecutando (ya esta cerrada).
Yo me refería a que hicieras algo parecido a este ejemplo,
Aplicación:
Código Delphi
[-]
...
implementation
uses ShellApi;
function NecesitaActualizar(): Boolean;
begin
Result:= True;
end;
procedure TForm1.btnActualizarClick(Sender: TObject);
begin
if NecesitaActualizar() then
begin
ShellExecute(Handle,
'open',
'Actualizador.exe',
nil,
nil,
SW_SHOWNORMAL);
end;
end;
...
Actualizador:
Código Delphi
[-]
...
implementation
uses tlhelp32, ShellApi;
procedure CloseApplication(const ExeFileName: string);
var
Entry: PROCESSENTRY32;
hSnapShot, hProcess: THandle;
begin
hSnapShot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Entry.dwSize:= SizeOf(PROCESSENTRY32);
if Process32First(hSnapShot, Entry) then
while Process32Next(hSnapShot, Entry) do
if Entry.szExeFile = ExeFileName then
begin
hProcess := OpenProcess(SYNCHRONIZE + PROCESS_TERMINATE,
False,
Entry.th32ProcessID);
if hProcess <> 0 then
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
end;
end;
procedure Actualizar;
begin
Sleep(4000);
ShowMessage('Actualización terminada');
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
CloseApplication('Aplicacion.exe');
Actualizar;
ShellExecute(Handle,
'open',
'Aplicacion.exe',
nil,
nil,
SW_SHOWNORMAL);
Close;
end;
...
Saludos