共用方式為


支援雙重或分派介面

如同分派介面,所有雙重介面都必須繼承自 IDispatch,這會將其所有 IDispatch 函式 (GetIDsOfNames Invoke, GetTypeInfo GetTypeInfoCount) 委派回匯總工具 (ADSI) 的 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 存取。 根據目前的模型,實作雙重介面不應比實作分派介面更困難。