Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Febbraio 12, 2014, 09:13:47 am

Titolo: Windows rete: aggiornare eseguibile in esecuzione
Inserito da: bonmario - Febbraio 12, 2014, 09:13:47 am
Ciao a tutti,
ho alcuni miei programmi fatti con Lazarus che vengono usati da me e dai miei colleghi. Questi programmi sono in rete (Novell, ma non credo che questo influenzi qualcosa), in questo modo, quando faccio delle modifiche, aggiorno l'eseguibile una volta sola e le novità sono viste da tutti.
Il problema è proprio nell'aggiornamento dell'eseguibile: se qualcuno sta usando quel programma, l'eseguibile risulta vincolato e quindi non riesco a sostituirlo con quello nuovo.
Pensavo di essere riuscito a gestire la cosa tramite delle operazioni lanciate alla chiusura dell'eseguibile, ma mi sono reso conto che funziona solo se gli utenti chiudono il programma, ma se il programma è aperto quando spengono il PC, non funziona.

Qualcuno di voi ha già affrontato il problema ed ha rovato una soluzione affidabile?


Grazie in anticipo, Mario
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: nomorelogic - Febbraio 12, 2014, 12:35:40 pm
ho un trucco che funziona su windows ma per novell non ti saprei dire
se vuoi ti posto quello
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: bonmario - Febbraio 12, 2014, 01:29:13 pm
Prova, spero che non cambi molto ....

Quello che ho fatto io è questo (supponendo di dover aggiornare il programma pippo.exe):
- se il file "pippo.exe" è in rete, salvo nello stesso percorso il programma con il nome "pippo.exe.agg"
- quando il programma "pippo.exe" si chiude, verifica se esiste il file "pippo.exe.agg"
- se esiste, crea un file bat, lo lancia senza aspettare che termini e si chiude

Il file .bat fa queste operazioni:
- aspetta 2 secondi per essere sicuro che "pippo.exe" si sia chiuso
- copia "pippo.exe.agg" sopra a "pippo.exe"
- se la copia è andata a buon fine, cancella "pippo.exe.agg"

Ciao, Mario
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: Microges2000 - Febbraio 12, 2014, 03:51:28 pm
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 :


Codice: [Seleziona]
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
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: bonmario - Febbraio 12, 2014, 07:55:17 pm
Dovrei pensarci su, ma l'idea di fare il controllo all'avvio del programma e non alla sua chiusura, potrebbe essere interessante ...

Grazie, Mario
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: nomorelogic - Febbraio 13, 2014, 09:32:07 am
io sono ricorso alla magia nera :D

fate un .BAT e dentro mettete le seguenti 2 righe
Codice: [Seleziona]
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)
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: bonmario - Febbraio 13, 2014, 07:53:40 pm
Ciao,
ho letto solo ora la tua risposta, in ogni caso, oggi avevo già implementato il metodo suggerito da Microges2000. Ho fatto qualche test sul disco locale e funzionava, domani dovrei riuscire a provarlo in rete. Se non dovesse funzionare, proverò il tuo metodo.

Grazie a tutti, Mario
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: bonmario - Febbraio 14, 2014, 08:06:14 am
non ha alcuna importanza se il Programma.exe è attualmente in memoria in qualche client

Ho provato, ma non funziona. Secondo me o è una particolarità della rete Novell, oppure qui da me in azienda hanno settato le cose per impedire che un programma in uso venga sostituito.

Ciao, Mario
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: nomorelogic - Febbraio 14, 2014, 03:28:03 pm
infatti su una rete novell non avevo mai provato
Titolo: Re:Windows rete: aggiornare eseguibile in esecuzione
Inserito da: bonmario - Febbraio 14, 2014, 06:16:15 pm
Sì sì, l'ho scritto solo casomai dovesse servire a qualcuno in futuro !!!

Ciao, Mario