На этом шаге мы рассмотрим интерфейс IUnknown .
Интерфейс IUnknown, показанный на рисунке 1, должен присутствовать в любом СОМ-компоненте.
Рис.1. Интерфейс IUnknown
IUnknown содержит три метода, реализуемые Вами при создании CОM-объекта. В методе QueryInterface() Вы обеспечиваете клиентской программе механизм доступа к любому из интерфейсов, предоставляемых Вашим объектом.
Поскольку один экземпляр компонента может одновременно обслуживать запросы нескольких клиентов, Вы должны создать в своем объекте счетчик использования. Этот закрытый элемент данных отслеживает число подключившихся клиентских приложений. Его обслуживают методы AddRef() и Release(). При обнулении значения счетчика компонент самоуничтожается.
При создании СОМ-компонентов методы IUnknown должны быть указаны первыми в таблице vtable. Остальные методы, предоставляемые другими интерфейсами, перечисляются за ними.
На рисунке 2 показан примерный вид таблицы vtable объекта Encoder, приведенного на рисунке 1 предыдущего шага.
Рис.2. Примерная структура таблицы vtable
В vtable сначала перечислены методы IUnknown, за ними следуют методы, предоставляемые интерфейсом IEncode, а в конце - ICommunicate. Создавая экземпляр объекта Encoder, библиотека СОM получает указатель на начало vtable (на рисунке 2 - это pVtbl). Он может использоваться для вызова QueryInterface() - первой функции в таблице, которая должна быть реализована так, чтобы она возвращала указатель на запрашиваемый интерфейс.
На следующем шаге мы рассмотрим глобально уникальные идентификаторы.