8

Windows ターゲット展開で Microsoft Visual Studio 2008 を使用しています。ファイルを「自分自身を更新」するにはどうすればよいですか? 「ネットワークを介した送信」の部分は既にダウンしていますが、実行可能ファイルを自分自身に上書きするにはどうすればよいですか?

基本的に、自動アップデータも含まれるディレクトリの自動アップデータを作成したいのですが、アップデータはディレクトリ内のすべてを更新する必要があります。

おそらく、ファイル ロックが解除されるまでファイルへの変更を保留する方法が機能するでしょう。もしそうするなら、おそらくホットパッチでフォローアップするでしょう.

4

7 に答える 7

5

新しい実行可能ファイルを作成し、古い実行可能ファイルのコピーを削除または保存します。ネットワーク経由で差分を送信し、それを適用するための 3 番目のプログラム (更新モニターなど) を用意することができます。更新が利用可能であることがわかったときに、リモート アプリから開始できる小さなスクリプトにすぎません。アップデーターは自分自身の名前を $UPDATER_OLD_VERSION などに変更し、それ自体の更新されたコピーを適切な名前で書き込み、新しいアップデーターを実行するときに、アプリ ディレクトリに $UPDATER_OLD_VERSION という名前のファイルがあるかどうかを確認して削除します。他のすべてのファイルは、更新/上書きされる可能性があります。

于 2009-06-17T20:30:45.203 に答える
4

これが私が最近やった方法です。古いプログラムの実行と新しいプログラミングの実行が少し重複しています。古いファイルをシャットダウンする前に、現在の実行可能ファイルの名前を変更して新しいファイルを配置できるというトリックを利用しています。これは 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.
}
于 2011-07-21T05:05:50.923 に答える
3

通常、実行中のアプリを変更することはできません。元のプログラムを閉じて、別の場所から変更する必要があります。

于 2009-06-17T20:47:40.037 に答える
2

実行中にファイルを上書きすることはできませんが、名前を変更することはできます。アップデーターで、既存の exe の名前を意味のあるもの (oldname_dateandtime) に変更し、新しいコピーを書き込みます。次に、システムを自動シャットダウンし、サービスから再起動します。アプリが起動すると、新しいバージョンが実行されます。

于 2009-06-17T21:04:01.597 に答える
2

これは、サイレント モードで起動される InnoSetup setup.exe を使用して行い、新しいファイルのインストールを開始する前にアプリをシャットダウンします。すべてが確実にシャットダウンされるように、カスタムの Pascal [Code] セクションを追加する必要がありましたが、それでうまくいきました。

于 2009-06-17T20:34:56.053 に答える
0

ファイルのバージョンとアップデーターについて話していると思います。あなたが言ったように、autoupdater が必要です。そのため、インストール ディレクトリを監視し、ディスク上のファイル バージョンをサーバーと比較するサービスを作成する必要があります。

不一致が発生したら、 server から最新のデータを取得できます。置き換えられるファイルが使用中の場合は、次回の再起動時に削除/登録解除するようにマークする必要があり、レジストリを使用してこれらを指定できます。

キャッシュ内のすべてのファイルをコピーし、後で再起動中にそれらをインストール ディレクトリにコピーできます。

于 2009-06-18T00:05:10.887 に答える
0

アップデーターを作成するときは、プログラムをいくつかに分割する必要があります。主な理由は、あなたがやりたいこととまったく同じでした。簡単に言うと、B はターゲット アプリケーションに加えて A を更新し、A は B を更新します。別の方法を見つけようとしましたが、非常に小さくてシンプルなアップデーターを作成しました。:(

于 2009-06-17T23:09:42.997 に答える