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

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で持つのも大げさなので、VBScriptを生成して、VBScriptで EXEファイルのコピーと再起動を行っています。生成するVBScriptは、EXEファイルをコピーし、そのEXEファイルを実行するというものです。 最初に実行したEXEファイルは、VBScriptを実行した直後に終了します。

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

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

 

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。
添付サイズ
ダウンロードはこちら (VB6版)1.62 KB
ダウンロードはこちら (Delphi6版)3.48 KB