2016-08-24 1 views
0

Когда я узнаю агрегацию СОМ, я знаю, что COuterclass::pUnkInner указывает на CInnerclass::INondelegationUnknown интерфейс, в то время как CInnerclass::QueryInterface не принадлежит INondelegationUnknown, так почему pUnkInner можно назвать QueryInterface, например, pUnkInner->QueryInterface.Почему pUnkInner может вызвать QueryInterface в агрегации COM?

+0

Вы всегда можете * вызвать QueryInterface указателем интерфейса. Детали, которые вы, вероятно, пропустили, это то, что INondelegationUnknown происходит от IUnknown, как и все COM-интерфейсы. И поэтому наследует три метода IUnknown. Мы не можем видеть это отсюда, но это нормальный путь. –

+0

Откуда вы изучаете COM? – acelent

ответ

0

Не знаете, что такое INondelegationUnknown - это не часть COM, возможно, специфичная для используемой структуры.

Но ключевая часть, так или иначе, внутренний объект агрегации должен обеспечивать две различные реализации IUnknown. Один из них является делегирующей реализацией - он переадресует все вызовы указателю IUnknown, предоставленному внешним в CoCreateInstance, когда сначала было установлено отношение агрегирования. Все интерфейсы, открытые внутренним, должны реализовать свои три метода IUnknown таким образом. Внешние руки эти интерфейсы для внешних клиентов - путем делегирования на внешний, сохраняется иллюзия единого бесшовного объекта.

Другая реализация IUnknown управляет подсчетом ссылок и предоставляет интерфейсы, реализованные самим внутренним объектом (например, обычный COM-объект) - это не делегируемая реализация, которую внешний класс использует для управления внутренним. Он никогда не подвергается внешнему воздействию. Внешняя использует этот не делегирующий указатель в своей собственной реализации QueryInterface, чтобы получить интерфейсы, реализованные внутренней (а затем передать их клиентам), а также в конечном итоге освободить их.

Смежные вопросы