C ++バイナリはどのように置き換えられますか?

私はこの質問をより一般的なデザインの文脈で以前に尋ねました。さて、具体的なことについてお話したいと思います。

私が app.exe を実行しているとします。 update.exe を同じフォルダにダウンロードします。 app.exe の内容を app.exe update.exe をどのようにコピーするのでしょうか?私は特にC + +の文脈で尋ねています。第3メディエーターアプリが必要ですか?ファイルロックについて心配する必要はありますか?極端なファイル権限を持つ不愉快なITスタッフを除いて、バイナリを更新する最も強力なアプローチは何ですか?理想的には、ポータブルソリューション(Linux + OSX)を見たいですが、Windowsが主なターゲットです。

28
私が知る限り、Windowsはプログラムの実行中にEXEを上書きすることはできません。これは、Windowsで最も迷惑なものの一つです。
追加された 著者 unwind,
私が他の質問に言ったように、実行中のexeを上書きすることはできません。私はこの全プロセスをどうやって行うのかを段階的に指示しました。
追加された 著者 Mooing Duck,
@MooingDuck知っている!私はまだあなたの答えを高いレベルのデザインとして参照しています。私はこの特定の質問の範囲を単に絞り込んでいます。既に、私は答えにかなり満足しています。
追加された 著者 TheBuzzSaw,

6 答え

  1. Move/Rename your running app.exe to app_old.exe
  2. Move/Rename your downloaded update.exe to app.exe
  3. With the next start of your application the update will be used

実行中のdll/exeファイルの名前を変更することは、Windowsでは問題になりません。

40
追加された

これはオペレーティングシステムの機能であり、C ++の機能ではありません。
あなたはどんなOSですか?

Windowsでは、 MoveFileEx( )関数は、実行中のアプリケーションを上書きするだけです(実行中の実行可能ファイルをlinux

9
追加された

Linuxでは、実行中のプログラムの実行可能ファイルを削除することができます:

  • download app.exe~
  • delete running app.exe
  • rename app.exe~ to app.exe

Windowsでは、実行中のプログラムの実行可能ファイルを削除することはできませんが、名前を変更することは可能です:

  • download app.exe~
  • rename running app.exe to app.exe.old
  • rename app.exe~ to app.exe
  • when restarting remove app.exe.old
8
追加された

Windowsでは、少なくとも実行中のアプリケーションが独自の.exeファイルと静的にリンクされたすべての.dllファイルをロックしています。これにより、再起動を防ぐためにアプリケーションが直接リードすることを防ぎます(再起動がOKであれば、アプリケーションは MOVEFILE_DELAY_UNTIL_REBOOT フラグをMoveFileExに渡して上書きすることができます)とにかく遅れているように、それは自分の.exeです)。これは、アプリケーションが通常、自分の.exeでアップデートをチェックしないが、アップデートをチェックしてから、「本物の」アプリケーションを起動するシムを起動する理由です。実際には、shimは適切に設定されたマニフェストファイルのおかげで、OS自体によってさえも可能です。 Visual Studioのビルドされたアプリケーションは、これをプレハブウィザードパッケージツールとして入手します。 Visual C ++アプリケーションのClickOnce展開を参照してください。

典型的なLinuxアプリケーションは、OSの多くの多くの味があるため、それ自体を更新しません。ほとんどのアプリケーションはソースとして配布され、自動地獄のいくつかのバージョンを実行して自分自身を構成してビルドし、 make install (これらはすべてパッケージの後ろで自動化できます)でインストールします。 Linuxの特定のフレーバーのためのバイナリとして配布されているアプリケーションでも、自分自身をコピーするのではなく、新しいバージョンを横に並べてインストールし、 シンボリックリンク をクリックすると新しいバージョンが有効になります。

OS XのアプリケーションはPosixの風味のものであればLinuxのバケツに入ってしまったり、最近あなたのためにアップデートを扱うMac AppStoreアプリバケツに入ったりします。

自分の自己アップデートを実行することは、これらのテクノロジ(ClickOnce、RPM、AppStore)のいずれの高度化にも到達せず、ユーザーにディスカバリ、アップグレード、アンインストールに対する予想される動作を提供することになります。私はその流れに行き、それぞれのプラットフォームでこれらの技術を使用します。

2
追加された
アプリユーザーインタラクティブまたはデーモン/サービスですか? ClickOnceのようなユーザーの対話型アプリケーションは、ユーザーに通知できます。デーモン/サービスタイプは環境に依存します:エンタープライズ環境では、管理者によって更新されます。管理者は、新しいビット(テストされていない、さらに重要なことに潜在的に侵害される)を自動的にダウンロードして実行することを非常に嫌っています。消費者デーモン/サービスは、自己更新のメリットをより簡単に売ることができます。
追加された 著者 Remus Rusanu,
制限された権限の下でソフトウェアが稼働する時間の99%であり、昇格されたコンテキスト( sudo UAC 承認フレームワーク
追加された 著者 Remus Rusanu,
継続的に実行されるアプリケーションはどうですか?私の場合、アプリケーションは常に実行され、(さまざまなタスクを実行することに加えて)更新を積極的に調査します。同じアップデートツールを使用することをお勧めしますか?
追加された 著者 TheBuzzSaw,
私はそれをデーモン/サービスとして分類します。基本的には、データを抽出することができます(ユーザーが許可した場合)。しかし、バグがポップアップします。ランダムな例は、人々の名前が後方に来ていることです。私は、本格的なソフトウェアをインストールすることなく、小さなバグ修正をすることができるようにしたいと考えています。
追加された 著者 TheBuzzSaw,

「再起動」問題を克服するためのアイデア。プログラムを作るのはどうでしょう。更新する必要はありません。プラグイン構造で実装するだけで、プログラムが必要とするすべての機能を.dllファイルにロードしてそこにmain関数を呼び出す更新ホストです。更新を検出すると(おそらくは別のスレッドで)、dllハンドルに閉じるように指示し、ファイルを置き換えて新しいハンドルを読み込みます。 こうすることで、アプリケーションが更新されている間もアプリケーションが実行され続けます(dllファイルのみがリロードされますが、アプリケーションは実行され続けます)。

2
追加された

他の多くのアプリと同様に、アップデータの3番目の実行可能ファイルを使用してください。

  • 新しいバージョンをダウンロードします。
  • アップデーターを新しいバージョンに置き換える予定です。
  • メインアプリを終了します。
  • アップデータが実行され、作業が行われます。
  • アップデータはあなたのアプリケーションの新しいバージョンを実行します。
  • アップデータが終了します。
0
追加された