이중 또는 디스패치 인터페이스 지원
디스패치 인터페이스와 마찬가지로 모든 이중 인터페이스는 모든 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를 참조하세요. 현재 모델에 따라 이중 인터페이스를 구현하는 것이 디스패치 인터페이스를 구현하는 것보다 더 어렵지 않아야 합니다.