QueryInterface
Хотя существуют механизмы, с помощью которых объект может выразить функциональность, которую он предоставляет статически (до создания экземпляра), базовый механизм COM — использовать IUnknown
вызываемый QueryInterface
метод.
Каждый интерфейс является производным от IUnknown
каждого интерфейса, поэтому каждый интерфейс имеет реализацию QueryInterface
. Независимо от реализации, этот метод запрашивает объект с помощью IID
интерфейса, к которому вызывающий объект хочет указатель. Если объект поддерживает этот интерфейс, QueryInterface
извлекает указатель на интерфейс, а также вызывается AddRef
. В противном случае возвращается E_NOINTERFACE
код ошибки.
Обратите внимание, что всегда необходимо соблюдать правила подсчета ссылок . При вызове Release
указателя интерфейса для уменьшения количества ссылок до нуля не следует использовать этот указатель еще раз. Иногда может потребоваться получить слабую ссылку на объект (т. е. может потребоваться получить указатель на один из его интерфейсов без увеличения количества ссылок), но это недопустимо, вызывая QueryInterface
вызов.Release
Указатель, полученный таким образом, является недопустимым и не должен использоваться. Это становится очевидным при _ATL_DEBUG_INTERFACES
определении, поэтому определение этого макроса является полезным способом поиска ошибок подсчета ссылок.