Pregunta

He escrito un simple servidor de inproc COM DLL con un único objeto COM simple. Los implementos de objeto COM un punto de conexión.

Sé cómo crear un cliente ATL que se deriva de IDispEventImpl, y utiliza un mapa de receptores para simplificar este proceso.

Sin embargo, para los propósitos de demostración, me gustaría crear una aplicación de consola Win32 que utiliza una clase que llama a mi sencilla objeto COM, entonces actúa como un sumidero de punto de conexión.

No tengo idea de cómo proporcionar una implementación de IDispatch - ¿Alguien puede recomendar documentación sobre esto, ya que no puedo encontrar ninguna (Tengo ATL Internos, pero esto no parece cubrir lo que necesito ).

Aquí está la clase ya tengo:

#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;
        }
};
¿Fue útil?

Solución

Como usted ya tiene ATL puede examinar sus fuentes y ver cómo IDispatchImpl hace todas esas cosas. IDispatch métodos se implementan therehby la lectura de datos de la biblioteca de tipos en el mismo módulo, ya que es la forma más fácil y fiable cuando una biblioteca de tipos ya está presente.

Es también digno de mención que es un tema bastante difícil para hacer una demostración en él - que necesita para escribir una gran cantidad de código que en realidad no trae ninguna visión. OMI será mucho mejor si se implementa un evento de interfaz que no hereda de IDispatch sino que hereda directamente de IUnknown -. Esto demostrará cómo funcionan los eventos sin arrastrar demasiado de atención a IDispatch funcionamiento interno

Otros consejos

Creo que la forma más fácil de hacer esto es a través de CreateStdDispatch

No es exactamente lo que estás buscando, pero FireBreath utiliza puntos de conexión IDispatchEx y para proporcionar un control ActiveX que se ejecuta en el IE. Debido FireBreath es una abstracción para permitir que los plugins a escribirse una vez y se utilizan en todos los principales navegadores, la interfaz IDispatch necesaria para ser escrito a mano -. Incluyendo los puntos de conexión

El código puede ser un poco confuso, ya que hay una clase mixin con plantilla utilizada para proporcionar IDispatch y ConnectionPoints a dos clases de objetos COM diferentes, pero puede ayudar.

Ya ha aceptado una respuesta, pero tal vez será aún ayuda. Lo siento, no veo la pregunta antes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top