C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  Update World C++: Сборник GPL QT исходников
  Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Нетология

 123 - Поддержка в MFC COM объектов / ActiveX по шагам / Приложение

Шаг 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();
}

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


| |
Автор Каев Артем.
[AD]





Letyshops [lifetime]