Unknown — базовый интерфейс COM
Интерфейс lUnknown обеспечивает минимальное «снаряжение» каждого объекта СОМ. Он содержит три операции и предоставляет любому объекту СОМ две функциональные возможности:
· операция Querylnterface() позволяет клиенту получить указатель на любой интерфейс объекта (из другого указателя интерфейса);
· операции AddRef() и Release() обеспечивают механизм управления временем жизни объекта.
Свой первый указатель на интерфейс объекта клиент получает при создании объекта СОМ. В качестве параметра операции Querylnterface задается идентификатор требуемого интерфейса (IID). Если требуемый интерфейс отсутствует, операция возвращает значение NULL.
Имеет смысл отметить и второе важное достоинство операции Querylnterface. В сочетании с требованием неизменности СОМ-интерфейсов она позволяет «убить двух зайцев»:
· развивать компоненты;
· обеспечивать стабильность клиентов, использующих компоненты.
По законам СОМ-этики новый СОМ-объект должен нести в себе и старый СОМ-интерфейс, а операция Querylnterface всегда обеспечит доступ к нему.
В многоликой СОМ-среде бремя ответственности за решение вопроса о финализации должно лежать как на клиенте, так и на СОМ-объекте. Можно сказать, что фирма Microsoft (создатель этой модели) разработала самурайский кодекс поведения СОМ-объекта — он должен сам себя уничтожить. Возникает вопрос — когда? Когда он перестанет быть нужным всем своим клиентам, когда вытечет песок из часов его жизни. Роль песочных часов играет счетчик ссылок (СЧС) СОМ-объекта.
Правила финализации СОМ-объекта очень просты:
· при выдаче клиенту указателя на интерфейс выполняется СЧС+1;
· при вызове операции AddRef выполняется СЧС+1;
· при вызове операции Release выполняется СЧС-1;
· при СЧС=0 объект уничтожает себя.
Конечно, клиент должен помогать достойному харакири объекта-самурая:
· при получении от другого клиента указателя на интерфейс СОМ-объекта он должен вызвать в этом объекте операцию AddRef;
· в конце работы с объектом он обязан вызвать его операцию Release.