1

単一の単純なCOMオブジェクトを使用して単純なCOMDLLinprocサーバーを作成しました。COMオブジェクトは、接続ポイントを実装します。

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

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

の実装を提供する方法が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;
        }
};
4

4 に答える 4

2

すでに持っているので、そのソースを調べて、それらすべてがATLどのように機能するかを確認できます。メソッドは、同じモジュール内のタイプ ライブラリからデータを読み取ることによって実装されます。これは、タイプ ライブラリが既に存在する場合に最も簡単で信頼性の高い方法だからです。IDispatchImplIDispatch

また、デモンストレーションを作成するのはかなり難しいトピックであることにも注意してください。実際には何の洞察ももたらさない多くのコードを記述する必要があります。IDispatchIMO から継承するのではなく、直接継承するイベント インターフェイスを実装すると、はるかにうまくいくでしょIUnknownIDispatch

于 2010-11-04T14:26:22.963 に答える
1

これを行う最も簡単な方法は、 CreateStdDispatchを使用することだと思います

于 2010-11-04T14:28:50.623 に答える
1

このIDispatch 実装を使用できます。

于 2011-05-11T18:33:30.853 に答える
0

探しているものとは異なりますが、FireBreathはIDispatchExと接続ポイントを使用して、IEで実行されるActiveXコントロールを提供します。FireBreathは、プラグインを一度作成してすべての主要なブラウザーで使用できるようにするための抽象化であるため、IDispatchインターフェイスは、接続ポイントを含めて手動で作成する必要がありました。

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

あなたはすでに答えを受け入れましたが、おそらくそれはまだ役立つでしょう。申し訳ありませんが、質問がすぐに表示されませんでした。

于 2011-05-28T06:14:24.300 に答える