Domanda

Ho scritto un semplice server inproc COM DLL con un singolo oggetto COM semplice. Gli strumenti di oggetti COM un punto di connessione.

Io so come creare un client ATL che deriva da IDispEventImpl, e utilizza una mappa lavandino per semplificare questo processo.

Ma, ai fini della dimostrazione, mi piacerebbe creare un'applicazione console Win32 che utilizza una classe che chiama il mio semplice oggetto COM, quindi agisce come un lavandino punto di connessione.

Non ho idea di come fornire un'implementazione di IDispatch - qualcuno può raccomandare documentazione su questo, come io non riesco a trovare alcuna (ho ATL Internals, ma questo non sembra per coprire quello che mi serve ).

Ecco la classe ho già:

#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;
        }
};
È stato utile?

Soluzione

Dal momento che si dispone già di ATL è possibile esaminare le sue fonti e vedere come IDispatchImpl fa tutta quella roba. metodi IDispatch sono implementati therehby lettura dei dati dalla libreria dei tipi nello stesso modulo dal momento che è il modo più semplice e affidabile quando una libreria tipo è già presente.

E 'anche interessante notare che si tratta di un argomento piuttosto difficile per fare una dimostrazione su di esso - è necessario scrivere un sacco di codice che in realtà non portare qualsiasi comprensione. IMO sarete molto meglio se si implementa una interfaccia di eventi che non eredita da IDispatch ma eredita direttamente da IUnknown -. Questo dimostrerà come funzionano gli eventi senza trascinare troppo di attenzione IDispatch funzionamento interno

Altri suggerimenti

Penso che il modo più semplice per farlo è attraverso CreateStdDispatch

È possibile utilizzare questa implementazione IDispatch .

Non è esattamente quello che stai cercando, ma dello sputare fuoco utilizza IDispatchEx e di connessione punti per fornire un controllo ActiveX che viene eseguito in IE. A causa dello sputare fuoco è un'astrazione per consentire plugin per essere scritti una sola volta e utilizzati in tutti i principali browser, l'interfaccia IDispatch doveva essere scritto a mano -. Compresi i punti di connessione

Il codice può essere un po 'di confusione, poiché non v'è una classe intermedia su modelli utilizzati per fornire IDispatch e ConnectionPoints a due diverse classi di oggetti COM, ma può aiutare.

Hai già accettato una risposta, ma forse sarà ancora aiuto. Mi dispiace non ho visto la questione prima.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top