простой обратный вызов в Visual C ++ - PullRequest
4 голосов
/ 30 ноября 2010

Я программист Linux и новичок в программировании COM, и я унаследовал программу, которую сейчас пытаюсь изменить. У меня есть файл IDL со следующим интерфейсом, и я пытаюсь настроить обратный вызов в C ++. Я искал в Интернете и нашел некоторые вещи с точками подключения, но я не вижу простого примера, которому я мог бы следовать, поэтому мне было интересно, кто-то может мне помочь.

Диспинтерфейс:

[
  helpstring("Event interface"),
  helpcontext(0x00000006)
]
dispinterface _DEvents {
    properties:
    methods:
        [id(0x00000001), helpstring("Occurs when about to begin."), helpcontext(0x0000000d)]
        void Starting();
        [id(0x00000002), helpstring("Occurs at the beginning."), helpcontext(0x00000011)]
        void Begin();
        [id(0x00000003), helpstring("Occurs at the end."), helpcontext(0x00000012)]
        void End();
};

кокласс:

[
  helpstring("C Class"),
  helpcontext(0x0000009e)
]
coclass C {
    [default] interface IE;
    [default, source] dispinterface _DEvents;
};

Интерфейс мойки:

[
  odl
]
interface INotifySink : IUnknown {
    HRESULT _stdcall Starting();
    HRESULT _stdcall Begin();
    HRESULT _stdcall End();
};

Я нашел эти две статьи, но не могу сделать из них головы или хвосты:

Я полагаю, мне нужно создать новый класс, который расширяет INotifySink и реализует функции, но что мне делать после этого?

Спасибо, Jayen

P.S. Дайте мне знать, если мне потребуется предоставить больше информации, и я отредактирую этот вопрос. Спасибо.

1 Ответ

1 голос
/ 01 декабря 2010

Вы спрашиваете, как использовать события существующего Coclass? Для этого вам нужно создать объект, который реализует интерфейс _DEvents, а не новый интерфейс.

Что-то вроде:

 class EventSink : public _DEvents
 {
     AddRef() { ... }
     Release() { ... }
     QueryInterface(...) { ... }
     Starting() { printf("Starting happend\n"); }
     Begin() { ... }
     End() { ... }
 }
 EventSink *es = new EventSink;
 IE *objectOfInterest = ...;
 IConnectionPointContainer *cpc;
 objectOfInterest->QueryInterface(&cpc);
 IConnectionPoint *cp;
 cpc->FindConnectionPoint(__uuidof(_DEvents), &cp);
 cp->Advise(es, &cookie);
 objectOfInterest->somethingthatfiresanevent();

Имеет ли это смысл?

...