Шаг 20 - IUnknown Метод QueryInterface

Через этот метод другие объекты получают указатели на интерфейсы данного класса. Ситуация здесь такая. Вообщем-то правила COM не дают возможности узнать какие имена интерфейсов есть. Эти имена надо знать заранее. Объявляется этот интерфейс в классе так.

class COAbsatract : public COleTestAbstract,
					public IUnknown
{
public:
	......
	STDMETHOD_ (HRESULT, QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppObj);
	......
};

Кроме объявления необходима еще и реализация. Вот один из примеров реализации.

STDMETHODIMP_ (HRESULT) COAbsatract::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppObj)
{
	HRESULT retCode=NOERROR;
	ppObj=0;
	if (IsEqualIID(riid,IID_IUnknown))
	{
		*ppObj=this;
		AddRef();
	}
	else retCode = E_NOINTERFACE;
	return retCode;
}

Идея такова. При обращении к этому методу возвращается this и клиент получает указатель на остальные методы объекта. Функция IsEqualIID сравнивает два интерфейса. Вот её описание.

BOOL IsEqualIID
( 
	REFGUID riid1, 
	REFGUID riid2  
);

Естественно, что возвращает либо TRUE либо FALSE. Вообщем написано примерно на русском вот что. Если запрашиваемый интерфейс Uinknown, то вернуть указатель на себя (класс, в котором этот интрефейс реализован). Осталось разобраться, что это за IID_IUnknown. Это уникальный номер CLSID, который определяет интерфейс. Вообщем клиент должен передать этот номер в нашу функцию QueryInterface, а в ответ получит указатель. Это справедливо для всех систем, которые используют COM вне зависимости от реализации.


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