Sunvisor Lab.

Register Now | Log in | Lost Password

クライアントのプログラムを自動バージョンアップする

トップ (メニュー)  >  プログラムパーツ  >  クライアントのプログラムを自動バージョンアップする

Visual Basicを使って、クライアントにプログラムを配布している場合、バグフィックスや機能追加などを行うたびに、インストールをやり直したり、EXEファイルを入れ替えたりする仕事は結構手間暇がかかって面倒くさいものです。プログラムのユーザーにとっても、アップグレードの度に、自分でインストールするのは面倒でしょうし、仕事中に「ちょっとごめん、アップグレードするからちょっとどいて」と仕事を中断されるのもうっとうしいにちがいありません。

そこで、簡単にEXEファイルをアップグレードする方法を考えてみました。EXEファイル自身に、自分よりも新しいものがリリースされたら、それをコピーしてくる機能をつければいいじゃないか、と。

方法としては、ネットワーク上のファイルサーバーにあるEXEファイルと、今クライアントにあるEXEファイルの日付を比較して、ネットワーク上のヤツが新しかったら、それをクライアントにダウンロードして、EXEファイルを起動し直す。というやり方です。こうすることで、ユーザーは常に新しいバージョンのEXEファイルを使い続けられます。

前提条件

利用環境がネットワークでつながっていること。

最新バージョンを保存してあるフォルダが見えないことにはどうしようもありませんからね。

他のコンポーネントに変更がないこと。

クライアントのPCにインストールされていないかもしれないような、コントロールの使用をし始めたような場合は、単にEXEファイルの交換だけでは、うまく行かない場合が出てきます。そのような大幅な仕様変更があった場合は、インストールのし直しなどをしなければなりません。

利用法

VB版

mdlAutoVerUp.bas をプロジェクトにインポートして、プログラムの最初の方でAutoVersionUpプロシージャをコールします。このProcedureをコールする前には、フォームをロードしたりいろいろとしない方が良いです。なんせ乱暴に Endステートメントでプログラムを終了させていますから。
お勧めの使い方は、Sub Main をスタートアップとして、Sub Main のなるべく初めの方でこのProcedureをコールする方法です。

Delphi版

Delphi版では、関数になっています。UAutoVerUp.pas をプロジェクトに追加して、プログラムの最初の方で(メインモジュールなど)AutoVersionUp関数を呼び出し、戻り値がtrueの場合には、プログラムを終了するようにコードを書きます。

構文

VB版

AutoVersionUp(sSetUpFolderUNC,[sFileName])

  sSetUpFolderUNC 最新バージョンのEXEが格納されているネットワークフォルダのパスをフルUNCパスで指定します。(別に仮想ドライブに割り当てられていてもいいですが、UNCの方が楽だと思います)
  sFileName EXEファイル以外に、更新する必要があるファイル(たとえばHelpファイルなど)も一緒に更新したい場合にそのファイル名を指定します。ここでファイル名を指定したものは、EXEファイルと同じフォルダに格納されます。また、sSetUpFolderUNCで指定したフォルダにそのファイルがなければなりません。
ファイル名は複数指定できます。複数指定する場合は、ファイル名の間をタブ文字(vbTab)で区切って指定します。

Delphi版

result := AutoVersionUp(sSetUpFolderUNC,[FileList]);

  sSetUpFolderUNC 最新バージョンのEXEが格納されているネットワークフォルダのパスをフルUNCパスで指定します。(別に仮想ドライブに割り当てられていてもいいですが、UNCの方が楽だと思います)
  sFileName EXEファイル以外に、更新する必要があるファイル(たとえばHelpファイルなど)も一緒に更新したい場合にそのファイル名を指定します。ここでファイル名を指定したものは、EXEファイルと同じフォルダに格納されます。また、sSetUpFolderUNCで指定したフォルダにそのファイルがなければなりません。
ファイル名は複数指定できます。複数指定する場合は、ファイル名の間をカンマで区切って指定します。

 

動作

まず、sFileNameで指定したファイルを更新します。sFileNameで指定したファイルの内、sSetUpFolderUNC上にあるファイルの方が新しければ、更新します。
次に、EXEファイル自身の日付を比較します。sSetUpFolderUNC上にあるEXEファイルの方が新しければ、EXEファイルをクライアントにダウンロードして、EXEファイルを再起動します。 その際、「 最新版がリリースされました。最新版にアップデートします」とメッセージが表示されます。
Delphi版の場合は、バージョンアップした場合に戻り値にtrueが帰ります。

テクニック

EXEファイルが実行中の時、EXEファイルは開かれた状態になっていますので、EXEファイルを別なところからコピーしてくることはできません。こうしたEXEを更新する処理を書く場合、いくつかの方法が考えられます。

  • EXEの更新をチェックする別プログラムを走らせ、当該EXEを実行し始める前にEXEの最新チェックとコピーを終えてしまってから、当該EXEを実行する。
  • EXEの中から更新をチェックし、最新版が見つかったらEXEをコピーするプログラムを実行する。

ここでは、後者の方法をとっています。コピーするプログラムを別のEXEで持つのも大げさなので、VBScriptを生成して、VBScriptでEXEファイルのコピーと再起動を行っています。生成するVBScriptは、EXEファイルをコピーし、そのEXEファイルを実行するというものです。最初に実行したEXEファイルは、VBScriptを実行した直後に終了します。

EXE更新・再起動のスクリプトは、VB Script で記述していますので、クライアントマシンには、Windows Scriptin Host(WSH) がインストールされている必要があります。諸般の事情で、WSHが使えないような場合は、このままで使用することは出来ませんが、生成するスクリプトをバッチファイルにするなどの方法とれば出来ないことはないでしょう。

生成されたスクリプトの中には、MsgBox関数でメッセージを表示しています。これは、ユーザーに「EXEはアップデートされましたよ!」という意思表示をする意味もありますが、Endステートメントで、EXEプログラムを終了させても、スクリプトでEXEファイルをコピーしようとした時に、まだEXEの終了処理が終わっていなくて、コピーできないという状況を避けるためでもあります。

ダウンロードはこちら (VB6版)

ダウンロードはこちら (Delphi6版)

プリンタ用画面
友達に伝える
投票数:11 平均点:9.09

前
GenGraphic開発メモ
カテゴリートップ
プログラムパーツ
次
MS-Accessを使ってVisual Basicの印刷プログラムを自動作成する
Powered by XOOPS Cube 2.0 © 2005-2006 The XOOPS Project | Designd by Theme4u.Net