Создание COM-объекта ATL, который реализует определенный интерфейс - PullRequest
2 голосов
/ 03 февраля 2010

Мне нужно реализовать простой COM-объект ATL, который реализует специальный интерфейс, для которого мне были предоставлены как файл .tlb, так и файл .idl. Интерфейс очень прост и состоит только из одного метода. В прошлом я создал много объектов ATL, но ни один из них не должен реализовывать определенный интерфейс. Что мне нужно для этого? Я предполагаю, что мне как-то нужно ссылаться на IDL или TLB интерфейса в моем новом объекте IDL где-нибудь?

Любые указатели приветствуются.

Ответы [ 4 ]

4 голосов
/ 03 февраля 2010

Это гораздо более автоматически, чем предлагают другие ответы здесь.Весь стандартный код написан для вас Visual Studio.

Вам повезло, что у вас есть .idl, я думаю, он самый удобный, на мой взгляд.

Вы можете вставить содержимоефайл .idl в существующий файл .idl вашего проекта ATL COM, который даст вам доступ к объявлениям в нем.Например, что-то подобное может быть вставлено в файл IDL:

[
    object,
    uuid(ecaac0b8-08e6-45e8-a075-c6349bc2d0ac),
    dual,
    nonextensible,
    helpstring("IJim Interface"),
    pointer_default(unique)
]
interface IJim : IDispatch
{
    [id(1), helpstring("method SpliceMainbrace")] HRESULT SpliceMainbrace(BSTR* avast);
};

Затем в представлении классов щелкните правой кнопкой мыши свой класс и выберите Add | Implement Interface.

Обратите внимание, что в этом диалоговом окнена самом деле вы можете найти файл .tlb, но я думаю, что лучше иметь простой текстовый источник для этих вещей, для контроля версий и т. п.

Выберите IJim из списка, нажмите > кнопка, чтобы добавить его в список для реализации.Нажмите Готово .

Visual Studio добавит это в ваш класс (вместе с кучей других дерьмов, чтобы заставить его работать):

// IJim Methods
public:
    STDMETHOD(SpliceMainbrace)(BSTR * avast)
    {
        // Add your function implementation here.
        return E_NOTIMPL;
    }
1 голос
/ 04 марта 2010

Я не вижу, как добавить свой вопрос к принятому ответу, но я пытался следовать инструкциям, приведенным в его примере, но я не мог получить интерфейс IJim, указанный в диалоговом окне «Реализация интерфейса» при выборе радиомодема проекта. Кнопка не отображала интерфейсы даже после того, как я скомпилировал файл IDL, выбор вместо того, чтобы перейти к библиотеке типов, тоже не помог.

1 голос
/ 03 февраля 2010

если у вас есть файл interface.tlb, вы можете использовать

#import "interface.tlb"

Чтобы включить его в файл .cpp, компилятор преобразует .tlb в объявление интерфейса в стиле C ++. Он создает файл с именем interface.tlh на лету, а затем #includes автоматически.

Затем вы используете обычный код стиля C ++ для написания класса, который реализует интерфейсы в сгенерированном файле .tlh.

1 голос
/ 03 февраля 2010

Когда вы компилируете файл .idl, вы можете попросить MIDL создать файл заголовка с определениями интерфейса C ++ - включите этот файл заголовка и унаследуйте ваш класс реализации от эквивалента C ++ конкретного интерфейса. Вам также может понадобиться передать интерфейс C ++ в качестве параметра базовым классам помощника ATL, таким как IDispatchImpl.

...