How to implement IDispatch in c++ COM with multiple interfaces

291 views Asked by At

I have 3 interfaces: IGetInformation, IAccount, ICreateATM and they inherit IDispatch. Also i have class CoATM that inherits these 3 interfaces.

How should I implement IDispatch for all my interfaces to work? I have this implementation and only IGetInformation is working:

STDMETHODIMP CoATM::GetTypeInfoCount(UINT* pctinfo)
{
    *pctinfo = 1;
    return S_OK;
}
STDMETHODIMP CoATM::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)
{
    HRESULT hr;

    *ppTInfo = 0;

    if (iTInfo)
        return DISP_E_BADINDEX;

    if (m_pTypeInfo)
    {
        m_pTypeInfo->AddRef();
        hr = S_OK;
    }
    else
        hr = LoadMyTypeInfo();
    if (SUCCEEDED(hr))
        *ppTInfo = m_pTypeInfo;
    return hr;

}
STDMETHODIMP CoATM::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)
{
    if (!m_pTypeInfo)
    {
        HRESULT hr;
        if (FAILED(hr = LoadMyTypeInfo()))
            return hr;
    }

    return DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgDispId);
}
STDMETHODIMP CoATM::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
    if (!IsEqualIID(riid, IID_NULL))
        return DISP_E_UNKNOWNINTERFACE;

    if (!m_pTypeInfo)
    {
        HRESULT hr;
        if (FAILED(hr = LoadMyTypeInfo()))
            return hr;
    }

    return DispInvoke(this, m_pTypeInfo, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);

}

HRESULT CoATM::LoadMyTypeInfo(void)
{
    HRESULT hr;
    LPTYPELIB pTypeLib;

    if (SUCCEEDED(hr = LoadRegTypeLib(CLSID_ATMTypeLib, 1, 0, 0, &pTypeLib)))
    {
        if (SUCCEEDED(hr = pTypeLib->GetTypeInfoOfGuid(IID_IGetInformation, &m_pTypeInfo)))
        {
            pTypeLib->Release();
            m_pTypeInfo->AddRef();
        }
        else if (SUCCEEDED(hr = pTypeLib->GetTypeInfoOfGuid(IID_IAccount, &m_pTypeInfo)))
        {
            pTypeLib->Release();
            m_pTypeInfo->AddRef();
        }
        else if (SUCCEEDED(hr = pTypeLib->GetTypeInfoOfGuid(IID_ICreateATM, &m_pTypeInfo)))
        {
            pTypeLib->Release();
            m_pTypeInfo->AddRef();
        }
    }

    return hr;
}

I think i only have IGetInformation working, because i first get it in LoadMyTypeInfo(). But i don't know how to get all my interfaces.

0

There are 0 answers