다음을 통해 공유


이중 또는 디스패치 인터페이스 지원

디스패치 인터페이스와 마찬가지로 모든 이중 인터페이스는 모든 IDispatch 함수(GetIDsOfNames, Invoke, GetTypeInfo, GetTypeInfoCount)를 다시 집계(ADSI)IDispatch로 위임하는 IDispatch에서 상속되어야 합니다. 위임하기 위해 확장 개체는 집계의 IDispatch 를 쿼리하고, 적절한 집계 메서드를 호출하고, 사용 후 포인터를 해제해야 합니다.

확장이 독립 실행형 구성 요소일 수 있는 경우 확장이 집계되었는지 확인합니다. 그렇다면 디스패치 함수를 집계의 IDispatch 로 다시 라우팅하고, 그렇지 않으면 IDispatch의 내부 구현을 호출하거나 IADsExtension 구현을 호출할 수 있습니다.

다음 코드 예제에서는 집계의 IDispatch에 대한 IDispatch 호출의 경로를 다시 지정하는 방법을 보여줍니다. 이 코드 예제에서는 m_pOuterUnknown 멤버 변수가 집계자의 IUnknown 포인터로 초기화되었다고 가정합니다.

/////////////////////////////////////////////////// 
// Delegating IDispatch Methods to the aggregator
///////////////////////////////////////////////////
STDMETHODIMP MyExtension::GetTypeInfoCount(UINT* pctinfo)
{
    IDispatch *pDisp = NULL;
    HRESULT    hr = S_OK;
    hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
    if ( SUCCEEDED(hr) )
    {
        hr = pDisp->GetTypeInfoCount( pctinfo );
        pDisp->Release();
    }
    return hr;
}
 
 
STDMETHODIMP MyExtension::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
    IDispatch *pDisp = NULL;
    HRESULT    hr = S_OK;
    hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
    if ( SUCCEEDED(hr) )
    {
        hr = pDisp->GetTypeInfo( itinfo, lcid, pptinfo );
        pDisp->Release();
    }
    
    return hr;
}
 
STDMETHODIMP MyExtension::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid)
{
    IDispatch *pDisp = NULL;
    HRESULT    hr = S_OK;
    hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
    if ( SUCCEEDED(hr) )
    {
        hr = pDisp->GetIDsOfNames( riid, rgszNames, cNames, lcid, 
                 rgdispid);
        pDisp->Release();
    }
    
    return hr;
 
}
 
STDMETHODIMP MyExtension::Invoke(DISPID dispidMember, REFIID riid,
        LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* 
                pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
    IDispatch *pDisp = NULL;
    HRESULT    hr = S_OK;
    hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
    if ( SUCCEEDED(hr) )
    {
        hr = pDisp->Invoke( dispidMember, riid, lcid, wFlags, 
                 pdispparams, pvarResult, pexcepinfo, puArgErr);
        pDisp->Release();
    }
    
    return hr;
}

확장 작성기는 확장 개체의 디스패치 인터페이스 대신 이중 인터페이스를 지원하는 것이 좋습니다. 이중 인터페이스를 사용하면 클라이언트에서 vtable 액세스를 사용하는 한 클라이언트가 더 빠르게 액세스할 수 있습니다. 자세한 내용은 ADSI 확장 모델의 지연 바인딩 및 Vtable Access를 참조하세요. 현재 모델에 따라 이중 인터페이스를 구현하는 것이 디스패치 인터페이스를 구현하는 것보다 더 어렵지 않아야 합니다.