扩展MFC中IDispatch的功能.

我在我的项目中遇到了这样的问题.

组件A,B,  都提供的dispatch 功能,现在要B也具有A中的方法属性.

方法就是要修改B的IDispatch的实现,把GetIDsOfNames,Invoke也交给A.

class  B :  public  CCmdTarget
{
public:
    DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(_Dispatch, IDispatch)
        STDMETHOD(GetTypeInfoCount)(UINT 
*pctinfo);
        STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo 
**ppTInfo);
        STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR 
*rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
        STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS 
*pDispParams, 
            VARIANT 
*pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
    END_INTERFACE_PART(_Dispatch)
}
;

BEGIN_INTERFACE_MAP(B, CWnd)
    INTERFACE_PART(B, _ATL_IIDOF(IDispatch), _Dispatch)
END_INTERFACE_MAP()

STDMETHODIMP B::X_Dispatch::GetTypeInfoCount(UINT 
* pctinfo)
{
    METHOD_PROLOGUE_EX(B, _Dispatch);
    
return E_NOTIMPL;
}


STDMETHODIMP B::X_Dispatch::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo 
** ppTInfo)
{
    METHOD_PROLOGUE_EX(B, _Dispatch);
    
return E_NOTIMPL;
}


STDMETHODIMP B::X_Dispatch::GetIDsOfNames(REFIID riid, LPOLESTR 
* rgszNames, UINT cNames, LCID lcid, DISPID  * rgDispId)
{
    METHOD_PROLOGUE_EX(B, _Dispatch);
    LPDISPATCH pDisp 
=  (LPDISPATCH)&pThis->m_xDispatch;
    HRESULT hr 
= S_OK;
    
if (SUCCEEDED(hr = pDisp->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId)))
    
{
        
return hr;
    }


    
if (pThis->m_pDispOuter != NULL
        
&& SUCCEEDED(hr = pThis->m_pDispOuter->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId)))
    
{
        
return hr;
    }

    
return E_NOTIMPL;
}


STDMETHODIMP B::X_Dispatch::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS 
* pDispParams, 
                                               VARIANT 
* pVarResult, EXCEPINFO  * pExcepInfo, UINT  * puArgErr)
{
    METHOD_PROLOGUE_EX(B, _Dispatch);
    LPDISPATCH pDisp 
=  (LPDISPATCH)&pThis->m_xDispatch;
    HRESULT hr 
= S_OK;
    
if (SUCCEEDED(hr = pDisp->Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr)))
    
{
        
return hr;
    }


    
if (pThis->m_pDispOuter != NULL
        
&& SUCCEEDED(hr = pThis->m_pDispOuter->Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr)))
    
{
        
return hr;
    }


    
return E_NOTIMPL;
}


请使用 DISP_FUNCTION_ID,DISP_PROPERTY_ID 等DISP_XXXXX_ID定义方法及属性,避免B的方法覆盖了A的方法.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值