У меня есть COM-объект с основным интерфейсом и интерфейсом событий (из файла IDL):
[
uuid(<interfaceId>,
helpstring("AxBitViewerWidget Interface")
]
dispinterface IAxBitViewerWidget
{
...
};
[
uuid(<eventsId>),
helpstring("AxBitViewerWidget Events Interface")
]
dispinterface IAxBitViewerWidgetEvents
{
...
};
[
aggregatable,
helpstring("AxBitViewerWidget Class"),
uuid(<mainClassId>),
control
]
coclass AxBitViewerWidget
{
[default] dispinterface IAxBitViewerWidget;
[default, source] dispinterface IAxBitViewerWidgetEvents;
};
Он был автоматически создан Active Qt. Затем в C# (в другой dll) я хочу подключиться к этому COM-объекту и обработать его события. Класс C# унаследован от AxHost
. Все COM-типы являются динамическими c в моем примере и используются через Reflection. Вот фрагмент:
public class BitViewerEx : AxHost
{
public BitViewerEx()
: base(<mainClassId>)
{
}
private void Initialize()
{
try
{
object ocx = GetOcx();
if (ocx != null)
{
Type ocxType = ocx.GetType();
Guid eventsGuid = new Guid(<eventsId>);
Type eventsType = Type.GetTypeFromCLSID(eventsGuid);
var sinkEventsInterfaceObj = CreateInstanceCore(eventsGuid);
// runtime error here
var cookie = new ConnectionPointCookie(ocx, sinkEventsInterfaceObj, eventsType);
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
}
}
При вызове ConnectionPointCook ie из вышеперечисленного - возникает ошибка (приблизительно переведенная из локализованного сообщения): «Невозможно выполнить Advise () для интерфейса событий« __ComObject »».
Мой код правильный? Как правильно подключить AxBase к событиям COM-объекта? (для случая типов Dynami c нельзя использовать IAxBitViewerWidgetEvents и т. д. c. в C# коде)
PS: методы класса (не события) вызываются без проблем, например:
ocx.GetType().InvokeMember("initialize", System.Reflection.BindingFlags.InvokeMethod,
null, ocx, new object[] { this.argum1, this.argum2 });
PS2: следующий код возвращает пустой массив:
System.Reflection.EventInfo[] arr = ocx.GetType().GetEvents();