C++ による BREW 開発(3)

まずは、C 言語で組まれたソースがどのようになっているかを見てみよう。


AEEModGen.c, AEEAppGen.c を使用している場合、最初に実行されるユーザコードは、AEEClsCreateInstance() だ。

int AEEClsCreateInstance( AEECLSID clsId , IShell* pIShell , IModule* po , void** ppObj ){
    *ppObj = NULL;
    
    if( clsId == AEECLSID_MYAPPLET ){
        if( AEEApplet_New( sizeof( MyApplet ) , clsId , pIShell , po , (IApplet**)ppObj ,
            (AEEHANDLER)MyApplet_HandleEvent,(PFNFREEAPPDATA)MyApplet_FreeAppData ) ){
            
            // 初期化
            init( (MyApplet*)(*ppObj) );
            
            return SUCCESS;
        }
    }
    return EFAILED;
}

AEEApplet_New() という、AEEAppGen.c に用意されている関数を実行している。
AEEApplet_New() の内部では、*ppObj にアプレット構造体の領域と仮想テーブル分の領域の MALLOC() と、仮想テーブルの初期化を行っている。


で、今回の目的はメインアプレットC++ で使えるようにすることなので、このメインアプレットは new で構築してやる必要がある。
こんな感じだろうか。

int AEEClsCreateInstance( AEECLSID clsId , IShell* pIShell , IModule* po , void** ppObj ){
    *ppObj = NULL;
    
    if( clsId == AEECLSID_MYAPPLET ){
        (*ppObj) = new MyApplet();
        if( (*ppObj) != NULL ){
            return SUCCESS;
        }
    }
    return EFAILED;
}

大分簡素になった。
AEEApplet_New() の処理は、メモリの確保と仮想テーブルの初期化なので、これはコンストラクタに書くべきだろう。
init() 関数が除かれているが、C++ の場合は MyApplet のコンストラクタで行うのが普通だろう。
ただ、初期化の際にエラー処理を行う必要があるのなら、それは何らかの関数で初期化して返り値で判定するか、もしくはコンストラクタで全ての処理が成功すれば true になるようなフラグを用意しておいてそれで判定する必要があるだろう。


あとは AEEApplet_New() で行われている処理を、MyApplet のコンストラクタに記述するだけだ。