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

9.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);

}