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

标签 c++ windows com atl idispatch

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

我知道如何创建从 IDispEventImpl 派生的 ATL 客户端,并使用接收器映射来简化此过程。

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

我不知道如何提供 IDispatch 的实现 - 有人可以推荐这方面的文档吗,因为我找不到任何文档(我有 ATL Internals,但这没有似乎无法满足我的需求)。

这是我已经上过的课:

#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;
        }
};

最佳答案

因为您已经有了 ATL,您可以检查它的来源并了解 IDispatchImpl 是如何完成所有这些工作的。 IDispatch 方法是通过从同一模块中的类型库中读取数据来实现的,因为当类型库已经存在时,这是最简单和最可靠的方法。

还值得注意的是,要对其进行演示是一个相当困难的主题 - 您需要编写大量代码,而这些代码并不能真正带来任何见解。 IMO 如果你实现一个不继承自 IDispatch 而是直接继承自 IUnknown 的事件接口(interface),你会好得多 - 这将演示事件如何在不拖动的情况下工作过多关注 IDispatch 内部工作。

关于c++ - 为连接点客户端提供 IDispatch 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4097544/

相关文章:

c++ - 虚拟赋值运算符 C++

c++ - 线程视频播放器同步

c++ - 为什么构造不完整类型的 std::unique_ptr 编译?

.net - 以编程方式查看移动数据终端(笔记本电脑/平板电脑/等)是否连接到扩展坞

c# - 函数的 IDL 声明(在 C++ 中)将从 C# 获取 C 样式数组

com - Windows 64 位注册表对比32位注册表

c++ - 对重载函数的模糊调用 - log 与 ptrdiff_t

c++ - 检查UTF-8是wchar_t还是char?

windows - SQL Server-连接在登录过程中被强行关闭

javascript - 如何将 C 数组从 C++ 传递到 javascript