Domanda

Sto utilizzando Microsoft Visual Studio 2008 con una distribuzione di destinazione Windows. Come farei un file " si aggiorna da solo " ;? Ho già ricevuto la "trasmissione su una rete" in parte, ma come faccio a scrivere un eseguibile su se stesso?

Fondamentalmente, voglio scrivere un aggiornamento automatico per una directory che include anche l'aggiornamento automatico, e il programma di aggiornamento deve aggiornare TUTTO nella directory.

Forse un modo per sospendere le modifiche al file fino al rilascio del blocco file funzionerebbe. Se dovessi farlo, probabilmente lo seguirei con una hot patch.

È stato utile?

Soluzione

Scrivi un nuovo eseguibile ed elimina o salva una copia di quello vecchio: potresti inviare un diff sulla rete e avere un terzo programma, il monitor di aggiornamento o qualsiasi altra cosa, per applicarlo. Sarebbe solo un piccolo script che potrebbe essere avviato dall'app remota quando si rende conto che è disponibile un aggiornamento. Il programma di aggiornamento potrebbe rinominarsi in $ UPDATER_OLD_VERSION o qualsiasi altra cosa, scrivere una copia aggiornata di se stesso con il nome appropriato, quindi quando viene eseguito il nuovo programma di aggiornamento si verifica se esiste un file denominato $ UPDATER_OLD_VERSION nella directory dell'app ed eliminarlo. Tutti gli altri file potrebbero essere semplicemente aggiornati / sovrascritti.

Altri suggerimenti

Ecco come l'ho fatto di recente. Vi è una breve sovrapposizione del vecchio programma in esecuzione e della nuova programmazione in esecuzione. Sfrutta il trucco che è possibile rinominare l'eseguibile corrente e mettere in atto il nuovo file prima di chiudere quello vecchio. Questo non è sicuro al 100%, ma l'unico modo in cui questo potrebbe "quotare" l'applicazione è se CopyFile fallisce.

#include <windows.h>
#include <iostream>
#include <fstream>

void UpgradeService::UpgradeSelf() {

  std::string temp = root         + "\\myprogram_tmp.exe";
  remove(temp.c_str()); // ignore return code

  std::string src = upgradeFolder + "\\myprogram.exe";
  std::string dst = root          + "\\myprogram.exe";


  rename(dst.c_str(),temp.c_str());
  CopyFile(src.c_str(),dst.c_str(),false);
  static char buffer[512];
  strcpy(buffer,dst.c_str());

  /* CreateProcess API initialization */
  STARTUPINFO siStartupInfo;
  PROCESS_INFORMATION piProcessInfo;
  memset(&siStartupInfo, 0, sizeof(siStartupInfo));
  memset(&piProcessInfo, 0, sizeof(piProcessInfo));
  siStartupInfo.cb = sizeof(siStartupInfo);

  ::CreateProcess(buffer, // application name/path
    NULL, // command line (optional)
    NULL, // no process attributes (default)
    NULL, // default security attributes
    false,
    CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE,
    NULL, // default env
    NULL, // default working dir
    &siStartupInfo,
    &piProcessInfo);


  ::TerminateProcess( GetCurrentProcess(),0);
  ::ExitProcess(0); // exit this process

  // this does not return.
}

In genere non è possibile modificare un'app mentre è in esecuzione. dovrai chiudere il programma originale e modificarlo da un'altra posizione.

Lo faccio usando un setup.exe di InnoSetup che viene avviato in modo silenzioso e arresta la mia app prima che inizi l'installazione dei nuovi file. Ho dovuto aggiungere sezioni personalizzate [Codice] Pascal per assicurarmi che tutto si spenga ma fa il suo lavoro.

Non puoi sovrascrivere un file mentre è in esecuzione, ma PUOI rinominarlo. Nel mio programma di aggiornamento, rinomino l'exe esistente in qualcosa di significativo (oldname_dateandtime), quindi scrivo la nuova copia. Quindi spengo automaticamente il sistema e lo riavvio da un servizio. All'avvio dell'app, è in esecuzione la nuova versione.

Quando ho creato un programma di aggiornamento, dovrei separare il programma diversi. Il motivo principale era lo stesso di quello che vuoi fare. Dì semplicemente, B aggiorna l'applicazione di destinazione più A e A aggiorna B. Ho provato a trovare un altro modo, ma quello che ho fatto è stato reso un aggiornamento più piccolo e semplice. : (

Penso che tu stia parlando delle versioni dei file e dei programmi di aggiornamento. Come hai detto, hai bisogno di autoupdater, quindi devi creare un servizio che monitora la tua directory di installazione e confronta la versione del file sul tuo disco con il server.

Quando si verifica una mancata corrispondenza, è possibile richiedere gli ultimi dati dal server. Se i file che verranno sostituiti sono in uso, è necessario contrassegnarli per la cancellazione / annullamento della registrazione al prossimo riavvio e è possibile menzionarli utilizzando il registro.

Puoi copiare tutti i file nella cache e successivamente al riavvio copiarli per installare la directory.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top