为连接点客户端提供IDispatch实现

我用一个简单的COM对象写了一个简单的COM DLL inproc服务器。 COM对象实现一个连接点。

我知道如何创build一个从IDispEventImpl派生的ATL客户端,并使用汇地图来简化这个过程。

但是,为了演示的目的,我想创build一个win32控制台应用程序,该应用程序使用调用我的简单COM对象的类,然后充当连接点接收器。

我不知道如何提供一个IDispatch的实现 – 有人可以推荐文档,因为我找不到任何(我有ATL内部,但这似乎并不包括我需要)。

这是我已经得到的课程:

 #pragma once #include <iostream> using namespace std; // Because we're implementing a connection points sink (_IPogFarmEvents) // in a non-ATL class, we must provide implementations for IUnknown and IDispatch. class KidWithAPogFarm : public _IPogFarmEvents { private: DWORD m_dwRefCount; LONG m_lNumPogs; public: KidWithAPogFarm() : m_dwRefCount (0), m_lNumPogs (0) { } ~KidWithAPogFarm() { } // -- IUnknown HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) { if (iid == DIID__IPogFarmEvents) { m_dwRefCount++; *ppvObject = (void *)this; return S_OK; } if (iid == IID_IUnknown) { m_dwRefCount++; *ppvObject = (void *)this; return S_OK; } return E_NOINTERFACE; } ULONG STDMETHODCALLTYPE AddRef() { m_dwRefCount++; return m_dwRefCount; } ULONG STDMETHODCALLTYPE Release() { ULONG l; l = m_dwRefCount--; if ( 0 == m_dwRefCount) delete this; return l; } // -- IDispatch STDMETHODIMP GetTypeInfoCount(UINT *pctinfo) { return E_NOTIMPL; } STDMETHODIMP GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo ) { return E_NOTIMPL; } STDMETHODIMP GetIDsOfNames(const IID &riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId ) { return E_NOTIMPL; } STDMETHODIMP Invoke(DISPID dispIdMember, const IID &riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ) { return E_NOT_IMPL; } // -- IAntFarmEvents STDMETHODIMP OnFarmCreated(LONG lInitialPopulation) { m_lNumPogs = lInitialPopulation; cout << "The kid has a pog farm with " << m_lNumPogs << " pogs " << endl; return S_OK; } }; 

Solutions Collecting From Web of "为连接点客户端提供IDispatch实现"

既然你已经有了ATL你可以检查它的源代码,看看IDispatchImpl是怎么做的。 IDispatch方法是通过从同一个模块中的类型库中读取数据来实现的,因为当类型库已经存在时,它是最简单和最可靠的方式。

另外值得注意的是,这是一个相当困难的话题 – 你需要编写大量的代码,这些代码并没有真正带来任何的洞察力。 如果你实现了一个不是从IDispatch继承的事件接口,而是直接从IUnknown继承的事件接口,那么你会好得多,这将演示事件是如何工作的,而不会将过多的注意力IDispatch内部工作上。

我认为最简单的方法是通过CreateStdDispatch

您可以使用此 IDispatch实现。

这不是你正在寻找的东西,但FireBreath使用IDispatchEx和连接点来提供在IE中运行的ActiveX控件。 由于FireBreath是一个允许插件一次写入并在所有主流浏览器中使用的抽象,所以需要手工编写IDispatch接口(包括连接点)。

该代码可能有点混乱,因为有一个模板化的mixin类用于为两个不同的COM对象类提供IDispatch和ConnectionPoints,但这可能有所帮助。

  • 混合类
  • ActiveX控件
  • 第二个COM控件(不是OLE)

你已经接受了一个答案,但也许还是有帮助的。 对不起,我没有看到这个问题。