In the first example we derive a class directly from FUnknown, using some of the helper macros provided by the SDK.
class CMyClass: public FUnknown
{
public:
CMyClass ();
virtual ~CMyClass ();
DECLARE_FUNKNOWN_METHODS // declares queryInterface, addRef and release
};
CMyClass::CMyClass ()
{
FUNKNOWN_CTOR // init reference counter, increment global object counter
}
CMyClass::~CMyClass ()
{
FUNKNOWN_DTOR // decrement global object counter
}
IMPLEMENT_REFCOUNT (CMyClass) // implements reference counting
tresult CMyClass::queryInterface (const char* iid, void** obj)
{
QUERY_INTERFACE (iid, obj, ::FUnknown::iid, CMyClass)
return kNoInterface;
}
Developing a class with more than one interface is done by multiple inheritance.
Additionally you have to provide an appropriate cast for each interface in the queryInterface method.
class CMyMultiClass: public IPluginBase,
public IPlugController,
public IEditorFactory
{
public:
DECLARE_FUNKNOWN_METHODS
// declare the methods of all inherited interfaces here...
};
tresult CMyMultiClass::queryInterface (const char* iid, void** obj)
{
QUERY_INTERFACE (iid, obj, ::FUnknown::iid, IPluginBase)
QUERY_INTERFACE (iid, obj, IPluginBase::iid, IPluginBase)
QUERY_INTERFACE (iid, obj, IPlugController::iid, IPlugController)
QUERY_INTERFACE (iid, obj, IEditorFactory::iid, IEditorFactory)
*obj = 0;
return kNoInterface;
}