質問

単一のシンプルなcomオブジェクトを備えた単純なcom dll inprocサーバーを書きました。 comオブジェクトは接続ポイントを実装します。

私はから派生するATLクライアントを作成する方法を知っています IDispEventImpl, 、およびシンクマップを使用して、このプロセスを簡素化します。

しかし、デモンストレーションの目的のために、私の単純なcomオブジェクトを呼び出すクラスを使用して接続ポイントシンクとして機能するWin32コンソールアプリケーションを作成したいと思います。

の実装を提供する方法がわかりません IDispatch - 誰かがこれに関するドキュメントをお勧めできますか?

これが私がすでに持っているクラスです:

#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 - これは、あまり注意を引くことなくイベントがどのように機能するかを示します IDispatch 内部の仕組み。

他のヒント

これを行う最も簡単な方法は通りだと思います createStddispatch

使用できます これ IDISPATCH実装。

それはあなたが探しているものではありませんが Firebreath IDISPatchExと接続ポイントを使用して、IEで実行されるActiveXコントロールを提供します。 Firebreathは、プラグインを1回記述し、すべての主要なブラウザで使用できるようにするための抽象化であるため、IdisPatchインターフェイスは接続ポイントを含む手で書く必要がありました。

コードは、2つの異なるCOMオブジェクトクラスにIDISPATCHと接続ポイントを提供するために使用されるテンプレートされたMIXINクラスがあるため、少し混乱する可能性がありますが、役立つ場合があります。

あなたはすでに答えを受け入れましたが、おそらくそれはまだ助けになるでしょう。申し訳ありませんが、質問は早くわかりませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top