* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 27, 2024, 03:41:21 pm

Inserisci il nome utente, la password e la durata della sessione.

36 Visitatori, 1 Utente
 

Autore Topic: Windows rete: aggiornare eseguibile in esecuzione  (Letto 7633 volte)

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Windows rete: aggiornare eseguibile in esecuzione
« il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #1 il: 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
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #2 il: 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

Microges2000

  • Global Moderator
  • Full Member
  • *****
  • Post: 130
  • Karma: +1/-0
    • Power of Nature
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #3 il: 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 :

  • 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

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
Il possibile lo abbiamo già fatto, l'impossibile lo stiamo facendo, per i miracoli ci stiamo attrezzando

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #4 il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #5 il: 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)
« Ultima modifica: Febbraio 13, 2014, 09:34:21 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #6 il: 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

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #7 il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #8 il: Febbraio 14, 2014, 03:28:03 pm »
infatti su una rete novell non avevo mai provato
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:Windows rete: aggiornare eseguibile in esecuzione
« Risposta #9 il: Febbraio 14, 2014, 06:16:15 pm »
Sì sì, l'ho scritto solo casomai dovesse servire a qualcuno in futuro !!!

Ciao, Mario

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19211
  • Topic in totale: 2290
  • Online Today: 100
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 36
Total: 37

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.