#include "pch.h" #ifdef USE_COM #include #include #include "../CWeChatRobot/WeChatRobotCOM_i.h" #include "../CWeChatRobot/WeChatRobotCOM_i.c" #include #include // CComModule m_commodule; class CSink : public CComObjectRoot, public _IRobotEventEvents { BEGIN_COM_MAP(CSink) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(_IRobotEventEvents) END_COM_MAP() public: virtual ~CSink() {} STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) { return E_NOTIMPL; } STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) { return E_NOTIMPL; } STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) { return E_NOTIMPL; } STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { #ifdef _DEBUG printf("sink, id: %d, parm: %f", dispIdMember, pDispParams->rgvarg[0].fltVal); #endif return S_OK; } }; BOOL PostComMessage(DWORD pid, int msgtype, VARIANT* msg) { HRESULT hr = S_OK; hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED); if (FAILED(hr)) return false; CComPtr spRobotEvent; hr = ::CoCreateInstance(CLSID_RobotEvent, NULL, CLSCTX_ALL, IID_IRobotEvent, (LPVOID*)&spRobotEvent); if (SUCCEEDED(hr)) { /* // 这段逻辑用于回调到微信 CComObject* sinkptr = nullptr; CComObject::CreateInstance(&sinkptr); DWORD cookies = 0; AtlAdvise(spRobotEvent, sinkptr, __uuidof(_IRobotEventEvents), &cookies); */ int __result = 0; spRobotEvent->CPostMessage(pid, msgtype, msg, &__result); } else { return false; } CoUninitialize(); return true; } #endif // !USE_COM