Softgate Limited

株式会社ソフトゲート コーポレートブログ

MT4 のアップデートの仕組み パート2

前回も述べたように、MT4 は、まず更新ファイルが存在すればそれをアップデートフォルダにダウンロードします。

そして、その MT4 の次回の起動時に、アップデートフォルダの中身を確認して、新しいバージョンの terminal.exe が存在すれば、アップデート処理を行います。

この「アップデート処理」は、具体的にはどのように実現されているのでしょうか。

アップデートの仕組み

アップデート処理の仕組みは、さほど難しいものではありません。

MT4 がアップデートする様子を見ていて、実際にどのような処理をしているかなんとなく想像が付いている方も多いでしょう。

模式的に表せば、MT4 が自分自身をアップデートするために、次のような処理が行われています。

f:id:Softgate:20140224175748p:plain

まず、インストールフォルダの terminal.exe(MT4 A と呼びます)は、自分自身を書き換えることはできませんので、アップデートフォルダに存在する terminal.exe(MT4 X と呼びます)を起動して、MT4 X にアップデート処理を依頼します。

その際、インストールフォルダが C:\Program Files 以下だったりすると、通常ユーザでは正しくアップデートできない恐れがあるため、MT4 X を実行するに当たって昇格が行われます。

MT4 をアップデートする最中に UAC の昇格確認ダイアログが表示されるのは、このタイミングです。

次に、MT4 A は、MT4 X が正しく起動されてアップデート準備が整ったことを(ウィンドウメッセージのやり取りを通じて)確認したら、自分自身のプロセスを終了します。

ここで、MT4 A の実行ファイル terminal.exe を変更できる状態になるので、MT4 X は自分自身および他のファイルをインストールフォルダにコピーします。

コピーが完了したら、MT4 X は、インストールフォルダにある新しいバージョンの terminal.exe を起動して、自分は終了します。

これを確認するために、ちょっと面白い実験をしてみました。

terminal.exe の新しいバージョンがアップデートフォルダに存在するかどうかを確認するとき、MT4 はファイル名とバージョン番号しかチェックしていません。

したがって、私が適当に作った terminal.exe というプログラムに、4.0.0.699 というバージョン情報を持たせてアップデートフォルダに置いておいたとしても、MT4 は新しいビルド 699 がそこに存在するものと判断して、アップデート処理を行うはずです。

というわけで、コマンドラインオプションをテキストボックスに表示するだけの簡単な .NET アプリを作って terminal.exe という名前でアップデートフォルダに置いてみました。

そうすると…

f:id:Softgate:20140224175825p:plain

上で説明したとおりに、/update "インストールフォルダのパス" というコマンドラインオプションを伴って、私のダミーアプリが起動されることが確認できました。

MT4 のアップデートに関するトリビア

  • MT4 はサーバ接続時にアップデートの存在を確認
    • このときは更新ファイルをダウンロードするだけ
    • 次回起動時までアップデートは適用されない
  • MT4 は起動時にアップデートフォルダの更新ファイルの存在を確認
    • 更新ファイルがなければそのまま普通に続行
    • 更新ファイルがあれば、アップデートフォルダの terminal.exe にアップデートを依頼
  • アップデートフォルダの位置はビルドによって異なる
    • ビルド 509 およびそれ以前は CSIDL_COMMON_APPDATA 以下
      • XP 系なら C:\Documents and Settings\All Users\Application Data\MetaQuotes\WebInstall\
      • Vista 以降なら C:\ProgramData\MetaQuotes\WebInstall\
    • ビルド 600 系は CSIDL_APPDATA 以下
      • XP 系なら C:\Documents and Settings\{ユーザ名}\Application Data\MetaQuotes\WebInstall\
      • Vista 以降なら C:\Users\{ユーザ名}\AppData\Roaming\MetaQuotes\WebInstall\