Через этот метод другие объекты получают указатели на интерфейсы данного класса. Ситуация здесь такая. Вообщем-то правила 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 вне зависимости от реализации.