Должен ли интерфейс IUnknown повторно реализовываться каждым новым COM-классом?

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

Спасибо


person Carl    schedule 28.06.2011    source источник


Ответы (3)


ЗСТ:

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

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

person Brandon Moretz    schedule 28.06.2011
comment
Этот мастер совершенно бесполезен. Когда я пытаюсь это сделать, он сообщает мне, что собирается добавить поддержку ATL в мой проект, а затем я получаю фатальную ошибку RC1015: невозможно открыть включаемый файл MyResource.h. Мой проект компилируется нормально, и файл MyResource.h существует, и это путь включения. - person Carl; 28.06.2011
comment
Но в любом случае вы ответили на вопрос, я забыл, что читал это в начале урока, извините за глупый вопрос. - person Carl; 28.06.2011
comment
@Carl Не глупый вопрос, у всех на земле бывают такие моменты (они возникают экспоненциально, когда я работаю с COM, который я обнаружил). Удачи вашему проекту. - person Brandon Moretz; 28.06.2011
comment
@Carl: Вы разрешаете этот RC1015, редактируя настройки компилятора ресурсов — они находятся в «Конфигурация» -> «Ресурсы» -> «Общие», и вам нужно изменить путь включения. - person sharptooth; 28.06.2011
comment
@sharptooth: Да, я уже сделал это, иначе мой проект не скомпилировался бы. Но когда я запускаю мастер, он выдает мне RC1015, затем я проверяю настройки проекта, и мои пути включения ресурсов удаляются. Поэтому я их переписываю, но каждый раз при запуске мастера они удаляются, не знаю почему -_-... - person Carl; 28.06.2011

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

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

person Anders    schedule 28.06.2011

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

person sharptooth    schedule 28.06.2011