Altra soluzioine un po' più complicata ma più elegante potrebbe essere.....
All'inizio le operazioni sono come quelle dette da bonmario ovvero:
copiare il file esattamente dove si trova il tuo programma cambiandogli nome (ad esempio se si chiama pppo.exe basta rinominarlo in pippo.new.exe) ed eseguirlo
Il tuo programma, alla partenza, vede come si chiama realmente (basta usare Application.ExeName) e :
- se si chiama pippo.new.exe entra nella routine di aggiornamento che, se l'utente da l'ok all'aggiornamento si autocopia con il vecchio nome, si chiude e fa partire il vecchio programma (vedi funzione dopo)
- se si chiama pippo.exe (l'utente non ha dato l'ok all'aggiornamento o siamo al passo 2 dell'aggiornamento vero e proprio) controlla che non esista il file pippo.new.exe e, se non esiste continua il lavoro normale, se esiste controlla la versione o la dimensione o quello che ti pare e, se si trova in condizione di doversi aggiornare si chiude e fa partire l'aggiornamento (vedi funzione dopo), altrimenti cancella il file pippo.new.exe e continua il lavoro
Procedure Chiudi_E_Avvia_Applicazione(Nome_Programma_Da_Avviare : String)
Var
NomeApplicazione : Array[0..1023] Of Char;
Begin
Parametri := Application.ExeName + ' ' + Parametri;
StrPCopy(NomeApplicazione, Nome_Programma_Da_Avviare);
ShellExecute(Application.Handle,'open', NomeApplicazione, nil, nil, SW_SHOWNORMAL);
Application.Terminate;
End;
ps. ovviamente se è in esecuzione pippo.new.exe e non è in esecuzione pippo.exe l'aggiornamento parte in automatico ;)
Ciao
io sono ricorso alla magia nera :D
fate un .BAT e dentro mettete le seguenti 2 righe
MOVE /Y E:\path_al_programma\Programma.exe E:\path_al_programma\sottocartella_SaveBin\Programma_VecchiaVersione.exe
COPY E:\path_aggiornamenti\Programma_NuovaVersione.exe E:\path_al_programma\Programma.exe
PAUSE
la prima riga (move), si salva la versione attuale del programma
la seconda riga effettua l'aggiornamento
non ha alcuna importanza se il Programma.exe è attualmente in memoria in qualche client
Edit:
se lanciate con doppio click, "pause" serve a darvi il tempo di leggere che è successo (se fate da shell, potete anche rimuoverlo)