Нужна ли специальная обработка вызовов QueryInterface от агрегирующих COM-объектов к агрегированным объектам? - PullRequest
1 голос
/ 11 октября 2019

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

Внешний объект должен вызывать свой управляющий метод IUnknown Release, если он запрашивает указатель на какой-либоинтерфейсов внутреннего объекта. Чтобы освободить этот указатель, внешний объект вызывает свой контролирующий метод AddRef IUnknown, а затем Release по указателю внутреннего объекта.

, и у него есть пример кода

// Obtaining inner object interface pointer 
pUnkInner->QueryInterface(IID_ISomeInterface, &pISomeInterface); 
pUnkOuter->Release(); 

// Releasing inner object interface pointer 
pUnkOuter->AddRef(); 
pISomeInterface->Release(); 

Мой вопроссущество: это необходимо? от какого сценария он защищает? как вы реализуете это, когда указатель живет дольше, чем вызов метода?

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

думаю этот вопрос должен быть самодостаточным, но если раньше люди задавали вопросы, когда я задавал вопросы без конкретного кода, если вам действительно нужен я, чтобы предоставить пример кода агрегатного класса, над которым я работаюдля ответа, что я могу добавить это. ИМХО, это не должно быть необходимым и не добавляет никакой ценности к вопросу, это довольно стандартный COM, и я просто спрашиваю о правилах здесь.)

...