IНеизвестно
В компьютерном программировании интерфейс IUnknown является фундаментальным интерфейсом объектной модели компонентов (COM). Спецификация COM [1] требует, чтобы COM-объекты реализовывали этот интерфейс. Более того, любой другой COM-интерфейс должен быть производным от IUnknown. IUnknown предоставляет две важные функции всех COM-объектов: управление временем жизни объекта посредством подсчета ссылок и доступ к функциям объекта через другие интерфейсы .
Интерфейс IUnknown (или производный от IUnknown) состоит из указателя на таблицу виртуальных методов , содержащую список указателей на функции, реализующие функции, объявленные в интерфейсе, в том порядке, в котором они объявлены в интерфейсе. Таким образом, издержки внутрипроцессного вызова идентичны вызовам виртуальных методов в C++. [2]
Методы
[ редактировать ]Интерфейс IUnknown предоставляет три метода : QueryInterface
, AddRef
, и Release
: [3]
QueryInterface
позволяет вызывающему объекту получать ссылки на интерфейсы, реализуемые компонентом. Это похоже наdynamic_cast<>
в C++ или приведения в Java и C# . В частности, он используется для получения указателя на другой интерфейс с учетом GUID , который однозначно идентифицирует этот интерфейс (обычно известный как идентификатор интерфейса или IID ). Если COM-объект не реализует этот интерфейс, вместо этого возвращается ошибка E_NOINTERFACE.AddRef
используется для увеличения счетчика ссылок, когда новый клиент получает объект. Он возвращает новый счетчик ссылок.Release
используется для уменьшения счетчика ссылок, когда клиенты завершили использование объекта. Он возвращает новый счетчик ссылок. Объект удалит себя во время выпуска, когда счетчик ссылок достигнет нуля, а это означает, что вызывающая сторона никогда не должна использовать интерфейс после вызова Release.
interface IUnknown {
virtual HRESULT QueryInterface (REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef () = 0;
virtual ULONG Release () = 0;
};
Идентификатор IUnknown интерфейса определяется как GUID со значением {00000000-0000-0000-C000-000000000046}.
Интерфейсы COM-компонента должны проявлять рефлексивные, симметричные и транзитивные свойства. Рефлексивное свойство означает способность QueryInterface
вызовите заданный интерфейс с идентификатором интерфейса, чтобы вернуть тот же экземпляр интерфейса. Свойство симметричности требует, чтобы при получении интерфейса B из интерфейса A через QueryInterface
, интерфейс A также можно получить из интерфейса B. Транзитивное свойство требует, чтобы, если интерфейс B можно получить из интерфейса A, а интерфейс C можно получить из интерфейса B, то интерфейс C можно получить из интерфейса A.
Разнообразный
[ редактировать ]- Компоненты, разработанные в соответствии со стандартом визуальных компонентов ActiveX, должны как минимум реализовывать интерфейс IUnknown. [4]
- IUnknown служит основой для Mac OS X. платформы Core Foundation CFPlugIn [5]
- Mozilla В компонентной модели XPCOM этот интерфейс также известен как nsISupports.
См. также
[ редактировать ]- IOleObject — это базовый интерфейс для объектов связывания и внедрения объектов (OLE).
- IDispatch — этот интерфейс обеспечивает динамическую отправку методов на основе имени для OLE Automation. COM-объектов
- IObjectWithSite — этот COM-интерфейс позволяет паре родительских и дочерних объектов подключаться друг к другу для реализации вспомогательного объекта браузера (BHO).
- IInspectable (WinRT) , производная от COM — среда выполнения Windows , использует этот интерфейс, производный от IUnknown, в качестве базового интерфейса.
Ссылки
[ редактировать ]- ^ Спецификация объектной модели компонентов , заархивировано из оригинала 15 февраля 2004 г.
- ^ «Компонентная объектная модель» . microsoft.com . Майкрософт. 30 мая 2018 года . Проверено 12 февраля 2019 г.
- ^ IНеизвестное определение на microsoft.com. Архивировано 11 июля 2013 г. на Wayback Machine ; по состоянию на 18 января 2008 г.
- ^ Элементы управления ActiveX на microsoft.com ; по состоянию на 18 января 2008 г.
- ^ Плагины на apple.com ; по состоянию на 18 сентября 2011 г.