#pragma once #include #include #include "utils.h" /** * 微信PID与客户端事件ConnectionPoint的cookie的映射,客户端使用自己关心的微信PID和cookie进行注册, * 服务端根据PID向订阅该PID的客户端发起事件调用 */ map> WxPidToEventCookie; template class CProxy_IRobotEventEvents : public ATL::IConnectionPointImpl { public: HRESULT Fire_OnGetMessageEvent(DWORD pid, unsigned long long msgid, VARIANT *msg) { HRESULT hr = S_OK; static ExpireSet es(2000); if (msgid && !es.CheckIfDuplicatedAndAdd(msgid)) { return hr; } T *pThis = dynamic_cast(this); if (WxPidToEventCookie.count(pid) == 0) { return hr; } const set cookies = WxPidToEventCookie[pid]; for (DWORD cookie : cookies) { pThis->Lock(); ATL::CComPtr punkConnection = this->m_vec.GetUnknown(cookie); pThis->Unlock(); if (punkConnection) { IDispatch *pConnection = static_cast(punkConnection.p); if (pConnection) { ATL::CComVariant varResult; DISPPARAMS params = {msg, nullptr, 1, 0}; hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, nullptr, nullptr); } else { WxPidToEventCookie[pid].erase(cookie); } } else { WxPidToEventCookie[pid].erase(cookie); } } return hr; } };