2

アプリケーションをアップグレードするための迅速かつ汚い方法を実行する必要があります。

現在、リリースごとに exe があります。

exeが間違っている場合、「dbで見つかったリリースX、リリースYにexeを使用しています。正しいvetsionをダウンロードしてください」というメッセージが表示されます。

次のような固定アドレスにすべてのexeがあります: http://myip.com/exes/N/Project.exe(Nはリリースです)

したがって、私の考えは、上記のメッセージの代わりに、ユーザーに「正しいexeがダウンロードされます。続行するには[OK]を押してください」というプロンプトを表示することでした。

私の考えはOKの後です:

1)ShellExecuteダウンロードと置換を処理する別のexe(id Update.exeと呼びましょう)で実行します(このexeはexeリソースに保存できます)

2) アプリケーションを閉じる

2) Update.exe はインターネットから正しい exe をダウンロードし、一時フォルダーに保存します。

4) Update.exe は Project.exe を削除し、ダウンロードしたものに置き換えます。

5) Update.exe は新しい Project.exe を実行します。

そのため、corret exe が実行され、ユーザーは新しい exe を古い exe と同じ場所に配置します。これは非 hortodox アップグレードになります (Windos の更新は使用しませんが、これが必要だと思います。Windows の更新は使用しません)。

このアプローチについてコメントいただけますか?または、同様のトリックを提案しますか?

4

5 に答える 5

4

私は少し異なるアプローチを取ります。ダウンロードに別の exe を使用する代わりに、バックグラウンド スレッドでメインの exe を実行するか、Windows BITS サービス (HTTP URL を受け入れる) を使用します。このようにして、ダウンロードの進行中にアプリを実行し続けることができ、ユーザーの余暇にアプリを再起動できます。メインの exe が開始されるたびに、一時フォルダーに完了した更新ファイルが存在するかどうかを確認し、見つかった場合はローダー exe を抽出して実行し、終了します。次に、ローダーはメインの exe が終了するのを待ち、更新ファイルを移動/名前変更して実行します。

于 2012-07-13T17:29:09.533 に答える
3

私はこれを行いますが、私にとってはうまくいきます:

OK の後、これは UpdateOKClick で行われます。

  1. 進行状況バーを表示し、InternetReadFile を使用して新しいバージョンのインストール実行可能ファイルを読み取り、それを一時ファイルに書き込みます (System ユニットで GetTempPath を使用します)。
  2. 「ダウンロードが完了しました。新しいバージョンをインストールするためにプログラムを閉じています。」というメッセージ ボックスを表示します。
  3. ShellExecute を呼び出して、一時ファイルの場所から新しいバージョンのインストール実行可能ファイルを実行します。秘訣は、 /silent と /noicons という 2 つの特別なパラメーター を使用してインストール プログラム (私はInno Setupを使用しています) を呼び出すことです。
  4. Application.Terminate を実行してプログラムを閉じます。

プログラムはすぐに終了し、インストールには少し時間がかかるため、プログラムが既に閉じられた後に開始されます。Inno Setup が表示するインストール進行状況画面がユーザーに表示されますが、2 つのパラメーターがあるため、質問はありません。

Inno Setup インストールの最後のステップは、プログラムを起動することです。/webupdate パラメーターを使用して呼び出します。

プログラムが起動されると、webupdate パラメータが使用されたかどうかがチェックされます。その場合、新しいバージョンに必要な初期化が行われ、「プログラムはバージョン xxx に更新されました」というメッセージ ボックスが表示されます。

ユーザーにいつでもキャンセルするオプションを与えるなど、途中で発行するチェックや可能なメッセージがたくさんありますが、基本的にはそれだけです。

...そして、以前の実行可能ファイルを削除する必要はありません。上書きされるだけです。ユーザーがプログラムの 2 番目のインスタンスを開いている場合、これは失敗しますが、それもチェックする必要があります。

于 2012-07-13T21:28:26.510 に答える
2

これが、ローカルの社内アプリに使用するアプローチです。アプリケーションの実行中に *.exe ファイルの名前を変更できるという事実に依存しています。

アップデータ クラスは、更新情報を含む XML ファイルをダウンロードします。その情報を現在実行中のアプリケーションと比較します。更新が必要な場合は、更新されたファイル (ローカル サーバー上にあるため、基本的にはファイルのコピー) をダウンロードし、.update 拡張子を追加します。次に、.bak 拡張子を追加して、現在実行中の exe の名前を変更します。次に、ダウンロードしたファイルの名前を元の exe 名に変更し、アプリケーションを再起動します。

以上が簡単な概要です。エラーや問題を説明するチェックと、ユーザーへのプロンプトがあります。古いバックアップなどを削除したり、必要に応じて以前のバージョンにロールバックしたりするためのクリーンアップ コードもあります。場合によっては、ユーザーの操作なしで起動時に上記を実行することで、更新を強制することができます。

最良のアプローチではないかもしれませんが、ローカル LAN では非常にうまく機能します。

于 2012-07-13T15:54:44.417 に答える
1

とにかくファイル構造を書き換えるつもりなので、さらに別のアプローチ: 小さなスタブ プログラムにバージョン チェックを実行させ、更新を要求 (および実行) させてから、実際のアプリを起動します。

于 2012-07-13T19:30:22.950 に答える
0

更新が main-exe のみに関係する場合、私がいつも行ってきたこと:

  • 新しいexeを一時的な場所にダウンロード
  • main.exe -update -c:\oldlocation\ などのパラメータを指定して新しい exe を呼び出します (ShellExecute)。
  • 近い

私のexeファイル(この場合、新しいもの)は特別な「更新」モードで開始され、置き換えられるはずのexeが終了するのを待ち、それ自体をコピーして上書きし、新しいexeを実行して終了します.

ダウンロードしたアップデートを削除するには、-doneupdating -c:\tempdownloadlocation などのパラメータを指定して新しい exe を呼び出すと、exe で削除できます。

このアプローチは、すべてがメインのexeに含まれているため、維持するのが非常に簡単で、追加のファイルを処理するために簡単に拡張できます

于 2012-07-15T07:36:02.320 に答える