Frage

Ich habe einen einfachen COM-DLL Inproc-Server mit einem einzigen einfachen COM-Objekt geschrieben. Die COM-Objekt implementiert ein Verbindungspunkt.

Ich weiß, wie ein ATL-Client erstellen, dass ergibt sich aus IDispEventImpl und ein Waschbecken Karte verwendet diesen Prozess zu vereinfachen.

Aber für die Zwecke der Demonstration, ich mag eine Win32-Konsole-Anwendung erstellen, die eine Klasse verwendet, die mein einfaches COM-Objekt aufruft, dann fungiert als Verbindungspunkt sinken.

Ich habe keine Ahnung, wie eine Implementierung von IDispatch zur Verfügung zu stellen - kann jemand Dokumentation zu diesem Thema empfehlen, da ich keine finden kann (ich habe ATL Internals, aber dies scheint nicht zu decken, was ich brauche ).

Hier ist die Klasse habe ich schon bekommen:

#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;
        }
};
War es hilfreich?

Lösung

Da Sie bereits ATL haben, können Sie seine Quellen untersuchen und sehen, wie IDispatchImpl all das Zeug tut. IDispatch Methoden therehby Lesen von Daten aus der Typbibliothek in dem gleichen Modul implementiert werden, da es die einfachste und zuverlässigste Weg ist, wenn eine Art Bibliothek bereits vorhanden ist.

Es ist auch erwähnenswert, dass es ein ziemlich hartes Thema ist eine Demonstration auf es für die Herstellung von - Sie brauchen eine Menge Code zu schreiben, die wirklich keine Einsicht bringen. IMO werden Sie viel besser dran, wenn Sie eine Ereignisse implementieren Schnittstelle, die nicht von IDispatch erbt, sondern erbt direkt von IUnknown -. Dies wird zeigen, wie sich die Ereignisse arbeiten, ohne zu viel Aufmerksamkeit zu ziehen Innenleben IDispatch

Andere Tipps

Ich denke, der einfachste Weg, dies zu tun, ist durch CreateStdDispatch

Sie können mit diese IDispatch-Implementierung.

Es ist nicht genau das, was Sie suchen, aber firebreath verwendet IDispatchEx und Verbindungsstellen ein ActiveX-Steuerelement bieten das läuft im Internet Explorer. Da firebreath eine Abstraktion ist Plugins zu erlauben einmal und in allen gängigen Browsern verwendet geschrieben werden, benötigt die IDispatch-Schnittstelle mit der Hand geschrieben werden -. Einschließlich Anschlussstellen

Der Code kann ein wenig verwirrend sein, da es eine Templat mixin Klasse verwendet wird, ist IDispatch und ConnectionPoints auf zwei verschiedene COM-Objekt-Klassen zur Verfügung zu stellen, aber es kann helfen.

Sie haben bereits eine Antwort akzeptiert, aber vielleicht wird es noch Hilfe. Leider sah ich die Frage nicht früher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top