BREW Smart Object

BrewSmartPtr を使えば、BREW のインターフェースオブジェクトもスマートポインタにすることが出来るようになる。

// BREW のインターフェースオブジェクトを解体するための Deleter
class BrewShellDeleter : public BrewRefCountDeleterBase{
public:
    virtual void Delete( void* p ){
        if( p != null ){
            IBASE_Release( (IBase*)p );
        }
    }
};

int CreateInstance( BrewSmartPtr< IShell > shell , AEECLSID id , BrewRefObject& obj ){
    void* p = null;
    obj = null;
    int result = ISHELL_CreateInstance( shell.get() , id , &p );
    if( result == SUCCESS ){
        obj.Set( (IBase*)p , BrewShellDeleter() );
    }
    return result;
}

こうすれば、わざわざ *_Release() を行う必要が無くなる。


あとは *_QueryInterface() とかの、内部で *_AddRef() を呼び出すようなやつを wrap してしまえば、ユーザ側で *_Release() を一度も呼び出すことなく、BREW のプログラムを書くことが出来る……ような気がする。試したこと無いから知らない。