2010-12-02 19 views
2

私はDelphiでいくつかのサービスを書いていますが、LAN uncパスまたはhttpサーバーからサービスを自動更新する機能を追加したいと考えています。私はこれを熟考しており、人々のアイデアを聞くことに興味があります。定期的に更新を確認するスレッドを作成できますが、サービスを自動的にアンインストールしてインストールする方法についてはどうしたらいいですか?私の最初の考えは、これを行うためのコンソールアプリケーションを作成し、プロセスを作成して起動し、サービスを停止してコンソールアプリケーションを終了させ、新しいバージョンのサービスを終了します。これはいいストレイテージかシュールなんですか?事前のおかげでサービスの自動更新

+0

誰でもWindowsビットapiを使用しようとしましたか?これは、Windowsの更新プログラムが使用するメカニズムです。 – MikeT

答えて

1

お勧めの通りです。スレッドは時々更新をチェックします。存在する場合は、それをダウンロードして適切な場所に配置します。そして、それが健康であることを確認します(壊れたくない!)。最後に、スレッドは、何をすべきかを示すパラメータ、特にサービスの名前、置き換えるファイルの場所、およびそれを置き換えるファイルを指定して、別のアプリケーションを起動します。その後、サービスはただ待っています。

アップデーターアプリケーションが起動すると、サービスがすべて安定していることを確認してから、サービス制御APIを使用してサービスを停止します。それはそれがなくなるまでそれを監視します。最後に、Windowsが実際にファイルを終了したことを少しでも一時停止します。次に、古いファイルの名前を変更して、それを途中で移動させます(まだ使用している場合は、数回再試行してから、新しいファイルを所定の場所にコピーします)。最後に、サービスが再び開始されます。その後、アップデータは終了します。

これは私のサービスやスタンドアロンのアプリケーション(アップデーターアプリケーションがどのモードを知るためのパラメータが異なるか)にも非常に信頼性があります。注意が必要な場合は、まったく同じシステムを使用してアップデータを更新できます。

+0

httpサーバとMS BITSを使用して転送を行うと、httpサーバは利用可能なアップデート、バージョン、MD5ハッシュ、タイムスタンプを詳述したXMLファイルを提供しました。 Delphiを使用してアップデート用の独自のhttpサーバを作成する場合は、最新バージョンのIndyを使用していることを確認してください。チャンク転送のサポートは実装されたばかりで、2.1GBを超えるファイルサイズのバグが報告され、修正されました。 – MikeT

0

は、あなたの考えは私には非常に良いと思われる、しかしaswellこれを考慮する: を - アンロードされますと、更新モジュール(。* dllファイル)をロードするサービスへのモジュール(メインコア)を追加アップデートが利用可能な場合 - この時間にサービスがキューか何かで「タスク」を置く必要があります... 加えて、あなたはPascal scriptまたはDWScript

1

のようなプラグインおよび/またはスクリプトを使用することができます私は、サービスのことだろう実際のコードがある別の実行可能ファイルまたはDLLファイルのみを更新するシェル。

シャットダウンを強制してシェルがアップグレードを実行して子を再起動するようにするには、シェルと子プロセスの間に通信方法があります。

これは、Windowsサービスをデバッグするために必要な余分な労力を心配することなく、子プロセスを直接実行することができるだけでなく、サービスのデバッグを簡単にします。