So habe ich es kürzlich gemacht. Es gibt eine kurze Überschneidung des laufenden Programms und der laufenden neuen Programmierung. Es verwendet den Trick, dass Sie die aktuelle ausführbare Datei umbenennen und die neue Datei an Ort und Stelle bringen können, bevor Sie die alte herunterfahren. Dies ist nicht zu 100% fehlersicher, aber die einzige Möglichkeit, die Ihre Anwendung "brick" machen könnte, ist, wenn CopyFile fehlschlägt.
#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.
}
Mögliche Dupe: http://stackoverflow.com/questions/250175/writing-my-own-auto-updater – crashmstr
kein Betrogene, dies ist speziell NATIVE C++. –