2012-02-06 9 views
23

I asked this question in un contesto di progettazione più generale prima. Ora, mi piacerebbe parlare delle specifiche.Come può un binario C++ sostituirsi?

Immagina di avere app.exe in esecuzione. Scarica update.exe nella stessa cartella. In che modo app.exe copia update.exe sul contenuto di app.exe? Sto chiedendo specificamente in un contesto C++. Ho bisogno di qualche tipo di app per la terza mediator? Devo preoccuparmi del blocco dei file? Qual è l'approccio più robusto all'aggiornamento binario stesso (salvo il personale IT odioso che dispone di autorizzazioni file estreme)? Idealmente, mi piacerebbe vedere soluzioni portatili (Linux + OSX), ma Windows è l'obiettivo principale.

+0

Per quanto ne so, Windows non consente di sovrascrivere un file EXE mentre il programma è in esecuzione. Questa è una delle cose più fastidiose di Windows, imo. – unwind

+1

Come ti ho detto su quell'altra domanda, non puoi sovrascrivere un exe in esecuzione. Ho anche dato istruzioni passo passo su come eseguire l'intero processo. –

+0

@MooingDuck lo so! Sto ancora riferendo la tua risposta come un progetto di alto livello. Sto semplicemente restringendo lo scopo di questa particolare domanda. Già, sono abbastanza soddisfatto delle risposte. – TheBuzzSaw

risposta

35
  1. Move/Rinominare il funzionamento app.exe-app_old.exe
  2. Move/Rinominare il scaricato update.exe-app.exe
  3. Con al prossimo avvio dell'applicazione verrà utilizzato l'aggiornamento

Rinominare un file dll/exe bloccato e bloccato non è un problema in Windows.

+7

non sapeva che si poteva rinominare un eseguibile in esecuzione! –

+0

Questo ha funzionato abbastanza bene per me, risolve il problema del pollo e dell'uovo con il mio updater. – Boccobrock

9

È una funzionalità del sistema operativo, non di tipo C++.
Quale sistema operativo sei attivo?

In Windows vedere la funzione MoveFileEx(), su linux basta sovrascrivere l'applicazione in esecuzione (Replacing a running executable in linux)

+0

+1 per il collegamento all'altro argomento. La soluzione di linux è fantastica! – Nawaz

7

Su Linux è possibile rimuovere il file eseguibile di un programma in esecuzione, quindi:

  • scaricare app.exe~
  • eliminare esecuzione app.exe
  • rinominare app.exe~ a app.exe

Su Windows non è possibile rimuovere l'eseguibile di un programma in esecuzione, ma è possibile rinominarlo:

  • scaricare app.exe~
  • rinomina esecuzione app.exe a app.exe.old
  • rinominare app.exe~-app.exe
  • al riavvio rimuovere app.exe.old
2

In Windows almeno un'applicazione in esecuzione sta chiudendo il proprio file exe e tutti i file .dll collegati staticamente. Ciò impedisce ad un'applicazione di aggiornarsi direttamente, ai lead se desidera impedire un riavvio (se il riavvio è OK l'app può passare nel flag MOVEFILE_DELAY_UNTIL_REBOOT su MoveFileEx ed è libera di "sovrascrivere" il proprio file .exe, come è in ritardo comunque). Questo è il motivo per cui in genere le applicazioni non controllano gli aggiornamenti sul proprio .exe, ma avviano uno shim che controlla gli aggiornamenti e quindi avvia l'applicazione 'reale'. Infatti lo 'shim' può essere fatto anche dal sistema operativo stesso, in virtù di un file manifest correttamente configurato. L'applicazione sviluppata da Visual Studio ottiene questo come uno strumento prefabbricato di pacchetto guidato, vedere ClickOnce Deployment for Visual C++ Applications.

L'app di Linux tipica non si aggiorna automaticamente a causa delle molte numerose varianti del sistema operativo. La maggior parte delle app è distribuita come sorgente, viene eseguita tramite alcune versioni di auto-hell per autoconfigurarsi e costruirsi, quindi installarsi tramite make install (tutte queste possono essere automatizzate dietro un pacchetto). Anche le app distribuite come file binari per un determinato tipo di Linux non si copiano da sole, ma installano la nuova versione side-by-side e aggiornano uno symbolic link per "attivare" la nuova versione (di nuovo, una gestione dei pacchetti il software può nascondere questo).

Le app OS X si inseriscono nel bucket di Linux se sono del tipo Posix o al giorno d'oggi cadono nell'app del Mac AppStore che gestisce gli aggiornamenti.

vorrei giorno in cui posizionare il proprio auto-update non raggiungerà mai la raffinatezza di una di queste tecnologie (ClickOnce, RPM, AppStore) e offrire all'utente il comportamento previsto vis-a-vis la scoperta, l'aggiornamento e la disinstallazione. Vorrei andare con il flusso e utilizzare queste tecnologie nelle rispettive piattaforme.

+0

E le applicazioni che vengono eseguite continuamente? Nel mio caso, l'app viene eseguita continuamente e verifica attivamente gli aggiornamenti (oltre a svolgere le varie attività). Consiglieresti comunque di utilizzare gli stessi strumenti di aggiornamento? – TheBuzzSaw

+0

L'utente dell'app è interattivo o demone/servizio? Le app interattive dell'utente come ClickOnce possono avvisare l'utente. daemon/tipo di servizio dipendono dall'ambiente: in un ambiente aziendale vengono aggiornati dagli amministratori, che sono molto riluttanti sulle app per il download automatico e l'esecuzione di nuovi bit (non testati e, soprattutto, potenzialmente compromessi). Un servizio/demone consumer avrebbe un tempo più semplice per vendere i vantaggi dell'aggiornamento automatico. –

+0

Lo classificherei come un demone/servizio. Fondamentalmente, è lì per estrarre i dati (come permesso dall'utente). Tuttavia, vengono visualizzati degli errori.Un esempio casuale potrebbe essere che i nomi delle persone arriveranno all'indietro. Voglio essere in grado di spingere una piccola correzione di bug senza tutti i fronzoli di un'installazione software completa. – TheBuzzSaw

2

Solo un'idea per superare il problema di "riavvio". Che ne dici di creare un programma, che non ha bisogno di essere aggiornato. Basta implementarlo in una struttura di plugin, quindi è solo un host di aggiornamento che carica un file .dll con tutte le funzionalità richieste dal programma e chiama la funzione principale. Quando rileva un aggiornamento (possibilmente in un thread separato), dice all'handle dll di chiudersi, sostituisce il file e carica quello nuovo. In questo modo l'applicazione continua a funzionare mentre si aggiorna (solo il file dll viene ricaricato ma l'applicazione continua a funzionare).

0

Utilizzare un terzo programma di aggiornamento come molte altre app.

  • Scarica nuova versione.
  • Pianifica il tuo programma di aggiornamento per sostituire l'app con la nuova versione.
  • Chiudi l'app principale.
  • Updater viene eseguito e funziona.
  • Updater esegue una nuova versione della tua app.
  • L'aggiornamento si chiude.
Problemi correlati