ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : BREW

BREW 環境と関連の深い SophiaFramework プログラミングテクニックを解説します。

リファレンスに記載されていないエラー番号の内容は … ?

SophiaFramework が返すエラー ( SFCError 型 ) に関して、その番号が [ 0x0000 〜 0x3FFF ] の範囲にあるものでリファレンスに記載のないものは BREW プラットフォームが返したエラーです。

これらのエラーの詳細内容については、BREW SDK に含まれる AEEError.h というファイルをご覧になってください。

      

SFXBrewPointer クラスの使用方法

SFXBrewPointer クラスは BREW インターフェースのインスタンスを自動管理するためのスマート ポインター クラスです。このクラスはテンプレート クラスとなっており、ラッパー クラスの種類だけ自動的に型が生成されます。

ラッパー クラスのインスタンスは、スマート ポインターで自動的に管理されますので、 SFXBrewPointer クラスを明示的に使用する必要はありません。

以下のようにして、明示的に型を生成することも可能です。

SFXBrewPointer クラスの使用方法
Void SFXPointerExplainer::_SFXBrewPointer(Void) const
{
    // 以下の 2 種類の変数宣言は同等
    // ( 通常、記述しやすい Smp バージョンを利用する )

    SFXBrewPointer<SFBDisplay> display1;
    SFBDisplaySmp display2;

    // ラッパー クラスのインスタンスの生成は、
    // 各ラッパー クラスの NewInstance() 関数または 
    // GetInstance() 関数を利用する
    // ( スマート ポインターがインスタンスを管理するので、解放処理は不要 )

    SFBGraphicsSmp graphics;
    SFBGraphicsPtr raw_graphics;

    if ((graphics = SFBGraphics::NewInstance()) != null) {

        // インスタンスの取得成功
    }

    // 管理しているインスタンスの生ポインターの取得

    raw_graphics = graphics.Get();

    // スマート ポインターの比較

    if (display1 == display2) {
    }

    if (display1 != display2) {
    }

    // スマート ポインターと生ポインターの比較

    if (graphics == raw_graphics) {
    }

    // null ポインターとの比較

    if (graphics != null) {
    }

    // 他の型を表すスマート ポインター同士の比較
    // ( 推奨されないが、設計上可能 )

    if (graphics != display1) {
    }

    // スマート ポインターが管理するインスタンスのポインターのキャストは、
    // static_pointer_cast 演算子などを利用する
    // ( static_cast 演算子を利用してはいけない )

    SFBBaseSmp base;
    SFBBitmapSmp bitmap;

    base = bitmap;
    bitmap = static_pointer_cast<SFBBitmap>(base);

    // 空インスタンスの取得
    // ( 関数の戻り値として空のインスタンスへの参照を返す場合に便利 )

    SFBFileSmpConstRef file(SFBFileSmp::EmptyInstance());

    unused(file);

    // 管理しているインスタンスの明示的な解放

    SFBFileMgrSmp filemgr;

    if ((filemgr = SFBFileMgr::NewInstance()) != null) {

        // SFXBrewPointer クラスの Release() 関数を呼び出す

        filemgr.Release();

        // SophiaFramework 3.0 以上では 
        // SFBBase (IBase) クラスの AddRef(), Release() 関数を呼び出せない

        /*
        filemgr->Release();
        */
    }

    return;
}
      

SophiaFrameworkから BREW エクステンションに AEEApplet 構造体のポインターを渡す方法

SophiaFramework には AEEApplet 構造体が存在しません。

SophiaFramework で AEEApplet に相当するクラスは、SFCApplet クラスですが、このクラスは IApplet クラスを独自に拡張した変数の並びとなっています。

そのため、SFBApplet::GetInstance() 関数や SFXHelper::getinstance() 関数を利用しても SFCApplet 構造体へのポインタが返ってくるので互換性はありません。

例えば、BREW エクステンション側が単純に IDisplay へのポインタを必要としているのであれば、以下の例のようにアプリ内で自前の AEEApplet 構造体を確保し、メンバを初期化した後、その AEEApplet 構造体へのポインタを渡すという方法が考えられます。

AEEApplet _brew_applet;

_brew_applet.m_pIDisplay = interface_cast(SFXGraphics::GetInstance()->GetSFBDisplay().Get());

3d_function(3d, &_brew_applet, ...);

// 必要に応じて他のメンバも初期化して渡します。

※ この方法は、エクステンション側がインターフェースへのポインタを単純に参照するだけの場合は有効ですが、アプレット自身の参照カウンタを変更するような特殊な場合には正常に動作しない可能性があります。