Aunque pienso que es complicarse demasiado, aquí te dejo una manera de hacerlo usando un archivo bat. Cuando quieras actualizarte, llama a la siguiente función pasándole la ruta del nuevo ejecutable, y cierra tu programa. El archivo bat se encargara de actualizar y volver a ejecutar tu aplicación.
Código Delphi
[-]
procedure Actualizate(Nuevo: string);
var
Actual: String;
Buffer: array[0..MAX_PATH] of Char;
begin
if GetShortPathName(PChar(ParamStr(0)),@Buffer, Sizeof(Buffer) -1) = 0 then
Exit;
Actual:= String(PChar(@Buffer));
if GetShortPathName(PChar(Nuevo),@Buffer, Sizeof(Buffer) -1) = 0 then
Exit;
Nuevo:= String(PChar(@Buffer));
with TStringList.Create do
try
Add(':BUCLE');
Add('Del ' + Actual);
Add('if %ERRORLEVEL% NEQ 0 goto BUCLE');
Add('Copy ' + Nuevo + ' ' + Actual);
Add('Start ' + Actual);
SaveToFile(ChangeFileExt(ParamStr(0),'.bat'));
ShellExecute(0,nil,PChar(ChangeFileExt(ParamStr(0),'.bat')),nil,nil,SW_SHOW);
finally
Free;
end;
end;
Actualizate('c:\Windows\Temp\nuevo.exe');
Halt;