Ecco come l'ho fatto di recente. C'è una breve sovrapposizione tra il vecchio programma in esecuzione e la nuova programmazione in esecuzione. Fa uso del trucco che è possibile rinominare l'eseguibile corrente e portare il nuovo file in posizione prima di chiudere il vecchio. Questo non è sicuro al 100%, ma l'unico modo in cui questo potrebbe "brick" la tua 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.
}
fonte
2011-07-21 05:05:50
Possibile Dupe: http://stackoverflow.com/questions/250175/writing-my-own-auto-updater – crashmstr
Non una vittima, questo è specificamente C++ nativo. –