Phase.7 エージェント配布サービスへ対応する(『スタパライフ』 Ver 1.22)

 Chapter.24 セットアップを改造してADS対応する

 『スタパライフ』本体の開発は完了したわけですが、最後にもう一つ、あれば便利という機能の実装が残っています。それは、ADS(エージェント配布システム)の自動インストール対応です。エージェントのパッケージは、一つのファイルにまとまってさえいればADSで配布することができるのですが、さらに一定の手順の処理を加えることで、ADSからファイルのダウンロード→セットアップの実行の一連の流れを自動化することができます。ユーザにとって便利なことは間違いないので、『スタパライフ』も自動インストールに対応することにしました。Ver 1.22のセットアップエージェントの全ソースはこちらをご覧下さい。

ADS(エージェント配布システム)から自動的にセットアップを起動する場合は、ファイル名は『setup』固定になります。名前が『setup』であるDlphi ScriptやVB Script、あるいはAir Cの実行ファイルが見つかった場合にだけ、ADSはセットアップ処理を起動できます(つまり、『setup.pas』『setup.vb』『setup.rx』等が存在する場合です)。ADSを利用したい場合は、セットアップエージェントの名前はこの規則に従って設定してください。そこで、このバージョンからセットアップエージェントの名前を『stpl.pas』から『setup.pas』に変更しています。以下、ADS対応の処理を解説します。


・ファイルのコピー
 まず最初に実行するのは、ファイルのコピーです。実行ディレクトリィがコピー先のディレクトリィで無かった場合は、『スタパライフ』エージェントを構成するファイルを、『スタパライフ』エージェント用のプラグインフォルダにコピーします。コピー先のフォルダは、『(AirWebのインストール先)\Plugin\stpl』としていて、ファイルのコピーを始める前にコピー先ディレクトリィを作成するようにしています。


  73://Pluginディレクトリィへのファイルコピーの準備
  74:  Auto := False;
  75:  Base := ExtractFilePath(Params.Items[0]);
  76:  Prefix := 'stpl';
  77:
  78://ADSによるセットアップかどうかの判別
  79:  InstallDir := PluginDir + '\' + Prefix;
  80:  if (Params.Count > 1) then DebugText(Params.Items[1]);
  81:  if (Params.Count > 1) and (LowerCase(Params.Items[1]) = '-auto') then begin
  82:    Auto := True;
  83:  end;
  84:  Failed := False;
  85:  Log := TStringList.Create;
  86:
  87://ベースディレクトリィが相対ディレクトリィじゃない時 かつ
  88://ベースディレクトリィとインストール先ディレクトリィが違うとき、ファイルのコピーを実行
  89:  if (Base <> 'stpl\') and (Base <> InstallDir +'\') then begin
  90:    if not DirectoryExists(InstallDir) then begin
  91:      if not CreateDir(InstallDir) then begin
  92:        Log.Add('NG: フォルダ(' + InstallDir + ') が作成できませんでした');
  93:        Failed := True;
  94:      end;
  95:    end;
  96:
  97:    if not Failed then begin
  98:      CopyFileEx(Base + 'setup.pas'      , InstallDir + '\setup.pas'      , False);
  99:      CopyFileEx(Base + 'setup.dfm'      , InstallDir + '\setup.dfm'      , False);
 100:      CopyFileEx(Base + 'stplBrowser.dfm', InstallDir + '\stplBrowser.dfm', False);
 101:      CopyFileEx(Base + 'autostpl.r'     , InstallDir + '\autostpl.r'     , False);
 102:      CopyFileEx(Base + 'stplBrowser.pas', InstallDir + '\stplBrowser.pas', False);
 103:      CopyFileEx(Base + 'download.h'     , InstallDir + '\download.h'     , False);
 104:      CopyFileEx(Base + 'stpl.htm'       , InstallDir + '\stpl.htm'       , False);
 105:      CopyFileEx(Base + 'autostpl.rx'    , InstallDir + '\autostpl.rx'    , False);
 106:      CopyFileEx(Base + 'stpl.ico'       , InstallDir + '\stpl.ico'       , False);
 107:      CopyFileEx(Base + 'stplBrowser.ico', InstallDir + '\stplBrowser.ico', False);
 108:      CopyFileEx(Base + 'stpl.txt'       , InstallDir + '\stpl.txt'       , False);
 109:      CopyFileEx(Base + 'stplBrowser.txt', InstallDir + '\stplBrowser.txt', False);
 110:    end;
 111:
 112://ファイルコピー失敗時、インストール不成功のログを保存し、設定保存ボタンを無効に
 113:    if Failed then begin
 114:      Log.Add('RESULT: FAILED');
 115:      Log.SaveToFile(Base + 'setup.log');
 116:      cmdOK.Enabled:=False;
 117:      ShowMessage('- 『スタパライフ』セットアップ -'#13#10'インストールに失敗しました.');
 118:    end else begin
 119://インストール成功のログを保存
 120:      Log.Add('NAME: 『スタパライフ』Agent for airWeb');
 121:      Log.Add('VERSION: 1.20');
 122:      Log.Add('DIRECTORY: ' + InstallDir);
 123:      Log.Add('RESULT: SUCCESS');
 124:      Log.SaveToFile(Base + 'setup.log');
 125:      Log.Free;
 126:    end;
 127:  end;
 『スタパライフ』をADSの自動インストール対応とするために、ファイルのコピーの成功・不成功を『setup.log』というテキストファイルに書き出していることに注目してください。『スタパライフ』エージェントでは、キャビネットに登録しているかどうかに関り無く、ファイルのコピーが正常に行われた時点でセットアップ成功としています。セットアップが正常に終了したことを通知するためには、setup.logに最低限『RESULT: SUCCESS』という行があれば良いようです。ファイルのコピーができなかった場合は、操作が続行できないように設定の保存を行うボタン(cmdOK)を押せないようにしています。

・ファイルコピーの実行部
 ファイルのコピーを行う実行部は、実際には別のプロシジャに分割されています。これは、ファイルのコピーと、その成功・不成功をログに書き出すという一連の処理を共通化するためです。『スタパライフ』エージェントでは、ファイルの名前を一つずつ指定してファイルコピー用のプロシジャを呼び出していますが、ディレクトリを指定してそこに含まれるファイルを全てコピーするようなプログラムも書くことは可能です。例えば、『AutoBoard』などが参考になるでしょう。



  47:procedure Tsetup.CopyFileEx(From: string; Dest: string; CheckExists: Boolean);
  48:var
  49:  Tmp: string;
  50:begin
  51:  Tmp := ': ファイルのコピー ' + From + ' -> ' + Dest;
  52:  if CheckExists and FileExists(Dest) then begin
  53:    Log.Add('OK' + Tmp);
  54:  end else begin
  55:    if CopyFile(From, Dest, False) then begin
  56:      Log.Add('OK' + Tmp);
  57:    end else begin
  58:      Log.Add('NG' + Tmp);
  59:      Failed := True;
  60:    end;
  61:  end;
  62:end;
 この処理では、特別難しいことはやっていません。ファイルのコピーとログの書き出しを行うだけです。ただし、このようなフォーム上のオブジェクトと関係しないプロシジャ(やファンクション)を追加する場合は、プロシジャ本体だけでなく、そのScript全体の宣言部にプロシジャ(またはファンクション)の名前と引数を書いておく必要があります(フォームエディタからソースを開いた場合は、必要な定義が宣言部に自動的に追加されていきます)。こちらから、Publicというセクションに、ファイルコピー用のプロシジャ『CopyFileEx』が定義されていることを確認してください。もう一つの『SaveSettings』は、設定の保存を行うためのプロシジャです


 これで、『スタパライフ』エージェントを自動インストール対応とすることができました。ADSのエージェントパブリッシャを使って、『スタパライフ』エージェントをAirClubの『読み物』カテゴリに登録して筆者の作業は完了です。ぜひ、皆さんもADSから『スタパライフ』をインストールして、動作を確認してみてください。


※最新のスタパライフでは、ADS対応の汎用のセットアップエージェントを使用してインストールするようになってしまいました(^^;
 いちいちこのような処理を書かずとも、汎用セットアップパッケージを使えば、簡単にADS自動インストール対応のパッケージを作成することができます。ADSに登録済ですので、ぜひご利用ください。