これは私が最近した方法です。実行中の古いプログラムと新しいプログラムの実行が少し重なっています。それは、あなたが現在の実行可能ファイルの名前を変更して、古いファイルをシャットダウンする前に新しいファイルをその場所に持っていくことができるというトリックを利用します。これは100%のフェイルセーフではありませんが、CopyFileが失敗した場合にアプリケーションが「レンガ」する可能性がある唯一の方法です。
#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.
}
可能なデュープ:http://stackoverflow.com/questions/250175/writing-my-own-auto-updater – crashmstr
ないだまされやすい人は、これは特にNATIVE C++です。 –