前のページ次のページ上に戻るホーム SophiaFramework 2.2

10.3. 起動の詳細

ここでは SophiaFramework を使用したアプレットの起動の詳細を解説します。

SophiaFramework を用いてアプレットを作る場合、最低限必要なコードは 以下のようになります。

#include <SophiaFramework.hpp>

SFMTYPEDEFCLASS(Demo)
class Demo : public SFRApplication {
  public:
    static inline SFCInvokerPtr Constructor(Void)
    {
      return(new Demo());
    }
	
  private:
    inline Demo(Void)
    {
      return;
    }
	
    virtual inline ~Demo(Void)
    {
      return;
    }
};

SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
  return((id == AEECLSID_DEMO) ? Demo::Constructor : NULL);
}

SFRApplication クラスを継承した Demo クラスがアプリケーションの 中心部になります。このクラスは起動時に自動的に一度だけ生成されます。 クラスを生成させるには、Demo クラスのコンストラクタを呼ぶために 静的メンバ関数を定義しなければいけません。

SFCApplet::Boot はアプレットのブート ローダであり、アプレットの 起動時に一番初めに実行されます。この関数は SophiaFramework を使用する開発者が 実装しなければなりません。この関数で行わなければならない処理は SFCInvokerSPP 型の関数ポインタを返すことです。この関数ポインタは 実際に起動されるアプリケーション クラスを作成するための関数への ポインタです。

SophiaFramework を使用したアプレットの起動順序は次のような順序と なります。まず、一番初めに SFCApplet::Boot 関数へ処理が来ます。 次に、SFCApplet::Boot で返した関数が起動されます。その関数は つまり Demo::Constructor です。Demo::Constructor 内では Demo クラスを生成します。

このような構造を取ることによって SophiaFramework では 複数クラス ID を切り替えてクラス ID ごとに起動するアプリケーション クラスを変更 できるようになっています。複数のアプリケーションを切り替えるには 以下のようなコードを記述します。

#include <SophiaFramework.hpp>

SFMTYPEDEFCLASS(Demo1)
class Demo1 : public SFRApplication {
  public:
    static inline SFCInvokerPtr Constructor(Void)
    {
      return(new Demo1());
    }
	
  private:
    inline Demo1(Void)
    {
      return;
    }
	
    virtual inline ~Demo1(Void)
    {
      return;
    }
};

SFMTYPEDEFCLASS(Demo2)
class Demo2 : public SFRApplication {
  public:
    static inline SFCInvokerPtr Constructor(Void)
    {
      return(new Demo2());
    }
	
  private:
    inline Demo2(Void)
    {
      return;
    }
	
    virtual inline ~Demo2(Void)
    {
      return;
    }
};

SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
  SFCInvokerSPP  result  = NULL;

  switch (id) {
    case AEECLSID_DEMO1:
      result = Demo1::Constructor;
      break;
    case AEECLSID_DEMO2:
      result = Demo2::Constructor;
      break;
  }
  return(result);
}