C++ 如何在c++;具有多个接口的COM

C++ 如何在c++;具有多个接口的COM,c++,com,idispatch,C++,Com,Idispatch,我有3个接口:IGetInformation、IAccount、ICreateATM,它们继承IDispatch。我还有继承这3个接口的CoATM类 我应该如何实现IDispatch以使我的所有接口正常工作? 我有这个实现,只有IGetInformation在工作: STDMETHODIMP CoATM::GetTypeInfoCount(UINT* pctinfo) { *pctinfo = 1; return S_OK; } STDMETHODIMP CoATM::GetTy

我有3个接口:IGetInformation、IAccount、ICreateATM,它们继承IDispatch。我还有继承这3个接口的CoATM类

我应该如何实现IDispatch以使我的所有接口正常工作? 我有这个实现,只有IGetInformation在工作:

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;
}

我想我只有IGetInformation在工作,因为我首先在LoadMyTypeInfo()中获得它。但我不知道如何获取所有接口。

您是否尝试过将MSVC作为COM项目来构建您的项目?它会自动完成很多这方面的工作。如果你想自己做,也许你可以用MSVC试试,看看它能产生什么。然后再画你的图案。(虽然使用MSVC中的工具来做这些事情通常要简单得多)好的,谢谢你的建议。