У меня есть библиотека .NET, которая должна быть открыта для взаимодействия COM, включая некоторые асинхронные операции. Таким образом, мне нужно реализовать события. Внедрение событий из C# кажется простым:Простейший способ реализовать .NET-события для C++
[ComVisible(true)]
[Guid("...")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IClass1Event))]
public class Class1: IClass1
{
public delegate Int32 IntIntFunc(Int32 arg);
public event IntIntFunc Event;
public Int32 RaiseEvent(Int32 param)
{...}
}
[ComVisible(true)]
[Guid("...")]
public interface IClass1
{
Int32 RaiseEvent(Int32 param);
}
[ComVisible(true)]
[Guid("...")]
public interface IClass1Event
{
Int32 Event(Int32 param);
}
Но у меня возникли проблемы с реализацией приемника событий на C++. Различные примеры Я встречал диапазон от простого IConnectionPoint::Advise
до простого «использования VB», но я сталкиваюсь с любой проблемой, пытающейся их реализовать (и нет, я не могу использовать VB) - либо ATL отказывается реализовать AddRef
для меня , или я не могу понять VTables своим умом (к сожалению, я очень разбираюсь в C-каркасах). У меня нет информации о том, какая структура предпочтительнее, только тот клиент - C++.
Итак, мой вопрос: какой бы самый простой способ показать .NET-события на C++, и, следовательно, какой был бы самый простой способ реализовать тестовый приемник?
P.S .: Действительно ли мне нужен интерфейс событий для IDispatch?
Вам не нужно, чтобы сделать ваш интерфейс событий 'IDispatch' если вы используете только ваши COM-объекты в C++, однако делать, если вы начнете использовать одни и те же объекты JavaScript или других языков сценариев. – Justin
Существует много реализаций C++ для обработчиков событий, по одному я могу порекомендовать boost.signals2 (терминология отличается, но введение неплохо объясняет, что к чему, doc: http://www.boost.org/doc/ libs/1_48_0/doc/html/signals2.html) –