Здравствуйте.
Есть Qt 5.1.1 и Windows XP 32 bit.
Есть некий COM объект, вот часть idl:
COM объект реализует несколько интерфейсов, среди прочих IAgentEvents
[
object,
uuid(0610FFE9-0FAA-46d1-B3E1-A1377D793E10),
oleautomation,
pointer_default(unique)
]
interface IAgentEvents:IUnknown
{
HRESULT InitOnAdvise([in] BSTR status,
[in] IQueueCollection* queues,
[in] IAgentPhoneSession* session);
HRESULT OnPhoneSessionOpened( [in] IAgentPhoneSession* session);
HRESULT OnStatusChanged( [in] BSTR status);
};
И есть объект реализующий этот интерфейс:
[
uuid(F24B5336-8DDA-4f8f-B561-78AE4D335657),
helpstring("Call Center Agent")
]
coclass CallCenterAgent{
[default] interface IAgent;
[source,default] interface IAgentEvents;
};
получаю объект агента следующим образом:
QAxObject* agent = callCenter->querySubObject("Agent()");
объект нормально создается, но к объекту не "цепляются" события:
InitOnAdvise(...);
OnPhoneSessionOpened(...);
OnStatusChanged(...);
посмотрел по исходному коду Qt:
события в QAxObject инициализируются (вызывается QAxBase::connectNotify()), только во время первого QObject::connect к сигналу этого объекта.
и еще в qaxbase.cpp есть код:
TYPEKIND eventKind = eventAttr->typekind;
eventinfo->ReleaseTypeAttr(eventAttr);
if (eventKind != TKIND_DISPATCH) {
eventinfo->Release();
break;
}
как раз игнорируется мой случай
В другом COM объетке связанном с вышеописанным есть такое описание:
[
uuid(84692E4E-5D0D-4f41-B298-B974792FD8A4),
helpstring("Connection Class")
]
coclass CSConnection
{
[default] interface ICSConnection;
[default, source] dispinterface _ICSConnectionEvents;
};
В котором события описаны как:
dispinterface _ICSConnectionEvents
С отловом событий в этом объекте проблем нет.
Как быть? Как поймать события?
Может кто знает куда копнуть для более низкоуровневой реализации отлова событий?
.net цепляется без проблем к этому объекту и его событиям.
Уже думаю писать обертку .net + qt, но тоже пока не знаю с какой стороны подойти.