Encontré un código diseñado para hacer un "actualizador" de la aplicación principal, y la lógica detrás de el es la siguiente:
1 . la aplicación principal verifica la fecha del ejecutable (de la misma aplicación) contra la fecha de otro ejecutable en una carpeta en la red
2. si el ejecutable en la red es mas reciente que el ejecutable actual, la aplicación principal ejecuta el "actualizador"
3. el actualizador cierra la aplicación principal, realiza la actualización del ejecutable y ejecuta nuevamente la aplicación principal
4. el actualizador se cierra.
el problema esta en el punto 3, por que el actualizador no cierra la aplicación principal, por consiguiente no puede realizar la actualización (si ejecuta la aplicación principal, lo verifique quitando el código que copia el ejecutable)
este es el código del actualizador :
Código:
uses tlhelp32, ShellApi;
{$R *.dfm}
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);
var
I: Integer;
xejecuta : boolean;
begin
for I := 0 to ParamCount() do
begin
if ParamStr(I) = 'd9705s9909' then
begin
xejecuta := true;
break;
end
else
xejecuta := false;
end;
if xejecuta = false then
begin
MessageDlg('Este programa no puede ser ejecutado directamente.', mtError, [mbOK], 0);
Application.Terminate;
end
else
begin
CloseApplication('asapm.exe');
Actualizar;
ShellExecute(Handle,
'open',
'asapm.exe',
nil,
nil,
SW_SHOWNORMAL);
Close;
end;
end;
realizando una prueba sencilla (con otro ejecutable que sustituyera la aplicación principal), si parece funcionar correctamente, aunque el código para llamar el actualizador es exactamente el mismo:
codigo que ejecuta el actualizador desde la aplicación principal:
Código:
if (MessageDlg('Existe una nueva version del sistema, deseas actualizarlo en este momento?', mtWarning, [mbYes, mbNo], 0) = mrYes) then
begin
ShellExecute(Handle,
'open',
'AU.exe',
Pchar('d9705s9909'),
nil,
SW_SHOWNORMAL);
end;
alguna idea de por que no se cierre la aplicacion principal?