В компьютерном программировании интерфейс IUnknown является основным интерфейсом в модели компонентных объектов (COM). Спецификация COM требует, чтобы объекты COM реализовали этот интерфейс. Кроме того, все остальные COM-интерфейсы должны быть производными от IUnknown. IUnknown предоставляет две основные функции всех COM-объектов: управление временем жизни объекта с помощью подсчета ссылок и доступ к функциям объекта через другие интерфейсы.
Интерфейс IUnknown (или производный от IUnknown) состоит из указателя в таблицу виртуальных методов, которая содержит список указателей на функции, реализующие функции, объявленные в интерфейсе, в том порядке, в котором они объявлены в интерфейсе. Таким образом, накладные расходы на вызовы внутри процесса идентичны вызовам виртуальных методов в C ++.
Интерфейс IUnknown предоставляет три метода : QueryInterface
, AddRef
и Release
:
QueryInterface
позволяет вызывающий объект для получения ссылок на интерфейсы, которые реализует компонент. Это похоже на dynamic_cast <>
в C ++ или приведения в Java и C #. В частности, он используется для получения указателя на другой интерфейс, учитывая GUID, который однозначно идентифицирует этот интерфейс (обычно известный как идентификатор интерфейса или IID ). Если COM-объект не реализует этот интерфейс, вместо этого возвращается ошибка E_NOINTERFACE.AddRef
используется для увеличения счетчика ссылок, когда новый клиент получает объект. Он возвращает новый счетчик ссылок.Release
используется для уменьшения счетчика ссылок, когда клиенты завершили использование объекта. Он возвращает новый счетчик ссылок. Объект удалит себя во время выпуска, когда счетчик ссылок достигнет нуля, что означает, что вызывающая сторона никогда не должна использовать интерфейс после вызова Release.interface IUnknown {virtual HRESULT QueryInterface (REFIID riid, void ** ppvObject) = 0; виртуальный ULONG AddRef () = 0; виртуальный выпуск ULONG () = 0; };
IUnknownидентификатор интерфейса определяется как GUID со значением {00000000-0000-0000-C000-000000000046}.
Интерфейсы COM-компонента должны демонстрировать рефлексивные, симметричные и транзитивные свойства. Reflexive свойство относится к способности вызова QueryInterface
на заданном интерфейсе с идентификатором интерфейса, чтобы вернуть тот же экземпляр интерфейса. Симметричное свойство требует, чтобы, когда интерфейс B извлекался из интерфейса A через QueryInterface
, интерфейс A также извлекался из интерфейса B. Транзитивное свойство требует, чтобы, если интерфейс B можно получить из интерфейса A, а интерфейс C можно получить из интерфейса B, то интерфейс C должен быть получен из интерфейса A.