Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
После того как у вас есть начальный указатель на интерфейс объекта, COM имеет очень простой механизм, чтобы узнать, поддерживает ли объект другой конкретный интерфейс и, если да, получить указатель на него. (Сведения о получении начального указателя на интерфейс объекта см. в разделе Получение указателя на объект.) Этот механизм представляет собой метод QueryInterface интерфейса IUnknown. Если объект поддерживает запрошенный интерфейс, метод должен вернуть указатель на этот интерфейс. Это позволяет объекту свободно перемещаться через интерфейсы, поддерживаемые объектом. QueryInterface отделяет запрос "Поддерживаете ли вы указанный контракт?" от высокопроизводительного использования этого контракта после успешного согласования.
Когда клиент изначально получает доступ к объекту, он получит, как минимум, указатель интерфейса IUnknown (самый базовый интерфейс), с помощью которого можно управлять жизненным циклом объекта, сообщив объекту, когда его использование завершено, и вызвать QueryInterface. Клиент запрограммирован на то, чтобы каждый управляемый им объект выполнял некоторые операции, но интерфейс IUnknown не имеет функциональности для выполнения этих операций. Вместо этого эти операции выражаются с помощью других интерфейсов. Таким образом, клиент запрограммирован вести переговоры с объектами по этим интерфейсам. В частности, клиент вызовет QueryInterface запрашивать объект для интерфейса, с помощью которого клиент может вызвать нужные операции.
Так как объект реализует QueryInterface, он имеет возможность принимать или отклонять запрос. Если объект принимает запрос клиента, QueryInterface возвращает новый указатель на запрошенный интерфейс клиенту. Через этот указатель интерфейса клиент имеет доступ к методам этого интерфейса. Если, с другой стороны, объект отклоняет запрос клиента, QueryInterface возвращает пустой указатель — ошибку, и клиент не имеет указателя, через который следует вызывать нужные функции. В этом случае клиент должен грамотно работать с этой возможностью. Например, предположим, что клиент имеет указатель на интерфейс A на объект и запрашивает интерфейсы B и C. Предположим, что объект поддерживает интерфейс B, но не поддерживает интерфейс C. Результатом является то, что объект возвращает указатель на B и сообщает, что C не поддерживается.
Ключевой точкой является то, что, когда объект отклоняет вызов QueryInterface, клиенту невозможно попросить объект выполнить операции, выраженные через запрошенный интерфейс. Клиент должен иметь указатель интерфейса для вызова методов в этом интерфейсе. Если объект отказывается предоставить запрошенный указатель, клиент должен быть готов сделать без этого, не выполняя никаких действий, которые он намеревался сделать с этим объектом или пытаясь вернуться к другому, возможно, менее мощному интерфейсу. Эта функция COM хорошо работает в сравнении с другими объектно-ориентированными системами, в которых нельзя знать, будет ли функция работать, пока не вызовете эту функцию, и даже тогда обработка сбоя не определена. QueryInterface предоставляет надежный и согласованный способ узнать, поддерживает ли объект интерфейс, прежде чем пытаться вызвать методы.
Метод QueryInterface также предоставляет прочный и надежный способ объекту указать, что он не поддерживает заданный контракт. То есть, если при вызове QueryInterface спрашивает, поддерживает ли "старый" объект "новый" интерфейс (например, который был изобретен после выпуска старого объекта), старый объект надежно, без аварии, ответит "нет". Технология, которая поддерживает это — алгоритм распределения идентификаторов IID. Хотя это может показаться небольшим моментом, это крайне важно для общей архитектуры системы. Возможность узнать у устаревших элементов о новой функциональности, что удивительно, является особенностью, отсутствующей в большинстве других объектных архитектур.
Связанные разделы