Шаг 123 - Поддержка в MFC COM объектов

Для того, чтобы в минимальном виде создать объект COM нам нужен интерфейс IUnknown ("Шаг 18 - Интерфейс IUnknown"). Для ActiveX это минимальное требование ("Шаг 121 - Что такое ActiveX"). Мы с Вами в шагах "Шаг 19 - IUnknown Методы AddRef и Relеase" и "Шаг 20 - IUnknown Метод QueryInterface" сами создавали реализацию этих методов. MFC облегчает нам работу предоставляя класс CCmdTarget. Этот класс обеспечивает методы интерфейса IUnknown используя карты интерфейсов (interface map). Создавая компонент нам нужно описать класс как наследника от CCmdTarget и внутри этого класса, используя макросы, сформировать интерфейсы. Вот пример использования:

class CPrintEditObj : public CCmdTarget
{
public:
	// member data and member functions for CPrintEditObj go here

// Interface Maps
protected:
	DECLARE_INTERFACE_MAP()

	BEGIN_INTERFACE_PART(EditObj, IEditInterface)
		STDMETHOD_(void, EditObject)();
	END_INTERFACE_PART(EditObj)

	BEGIN_INTERFACE_PART(PrintObj, IPrintInterface)
		STDMETHOD_(void, PrintObject)();
	END_INTERFACE_PART(PrintObj
};

BEGIN_INTERFACE_MAP(CPrintEditObj, CCmdTarget)
	INTERFACE_PART(CPrintEditObj, IID_IPrintInterface, PrintObj)
	INTERFACE_PART(CPrintEditObj, IID_IEditInterface, EditObj)
END_INTERFACE_MAP()

Макрос BEGIN_INTERFACE_PART автоматически объявляет 3 метода IUnknown, но только объявляет. Их нужно еще выполнить. Для этого используется макрос METHOD_PROLOGUE. При использовании этого интерфейса в методах мы получаем ссылку на внешний класс в pThis. Вот так например:

ULONG FAR EXPORT CEditPrintObj::XEditObj::AddRef()
{
	METHOD_PROLOGUE(CEditPrintObj, EditObj)
	return pThis->ExternalAddRef();
}

Данный подход похож на сбор указателей на интерфейсы в классе в отличии от наследования. Вообще есть два варианта. Первый это наследование, второй сбор указателей на интерфейсы.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 01.10.2002