Должен ли интерфейс IUnknown быть повторно реализован каждым новым классом COM? - PullRequest
5 голосов
/ 28 июня 2011

Извините, если этот вопрос кажется очевидным для всех, но я очень новичок в COM. Из учебника, который я вижу здесь http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567,, кажется, что каждый класс COM, созданный в C ++, должен реализовывать свои собственные QueryInterface, AddRef и Release. Поскольку эти методы должны иметь в основном одинаковую реализацию для любого нового класса, я не понимаю, почему не существует какого-то абстрактного класса или чего-то такого, что реализует его для разработчика. Я не понимаю, почему я должен заново реализовать то же самое, что многие люди уже внедрили снова и снова (если учебник не верен и что-то не так).

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 июня 2011

FTA:

«Я считаю, что каждый программист, желающий понять основные принципы, лежащие в основе COM, должен написать хотя бы один простой COM-объект, используя простой C ++, то есть без помощи шаблонов и макросов, которые идут вместе с MFC / ATL.»

Чтобы ответить на ваш вопрос: Да, каждый компонент COM должен реализовывать IUnknown , это фундамент, на котором построен COM. Однако, что касается «стандартного погружения» для создания COM-объектов, для этого предназначен ATL Project Wizard .

1 голос
/ 28 июня 2011

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

1 голос
/ 28 июня 2011

Если вы не хотите использовать ATL или другие вспомогательные библиотеки, вы можете использовать вспомогательную функцию QISearch , которая обрабатывает QueryInterface для вас.AddRef и Release могут быть реализованы в вашем собственном базовом классе.

COM должен работать и с простым C, чтобы Windows SDK не выходила за рамки определения класса и его методов.

...