WEB开发网
开发学院软件开发VC 组件对象模型与ATL实现补遗 阅读

组件对象模型与ATL实现补遗

 2010-09-04 20:48:00 来源:WEB开发网   
核心提示:组件对象模型与ATL实现文章写好了,但是遗漏了一个关键问题,组件对象模型与ATL实现补遗,就是还有一个需要修改atlcom.h文件的地方,我把它更正在这里,打开按上篇文章改正后的atlcom0.h,找到下面的函数:STDMETHODIMP IEnumOnSTLImpl<Base, piid, T, Copy, C

组件对象模型与ATL实现文章写好了,但是遗漏了一个关键问题。就是还有一个需要修改atlcom.h文件的地方,我把它更正在这里。打开按上篇文章改正后的atlcom0.h,找到下面的函数:

STDMETHODIMP IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next

更正为(只需要改变粗体的地方,一句话而已 )

hr = Copy::copy(pelt, &*m_iter);

改为

hr = Copy::copy(pelt, *m_iter);

改过之后的完整的函数如下:

template <class Base, const IID* piid, class T, class Copy, class CollType>
STDMETHODIMP IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next(ULONG celt, T* rgelt,
    ULONG* pceltFetched)
{
    if (rgelt == NULL || (celt != 1 && pceltFetched == NULL))
        return E_POINTER;
    if (pceltFetched != NULL)
        *pceltFetched = 0;
    if (m_pcollection == NULL)
        return E_FAIL;

    ULONG nActual = 0;
    HRESULT hr = S_OK;
    T* pelt = rgelt;
    while (SUCCEEDED(hr) && m_iter != m_pcollection->end() && nActual < celt)
    {
        // hr = Copy::copy(pelt, &*m_iter);
        hr = Copy::copy(pelt, *m_iter);    // CHEUNGMINE
        if (FAILED(hr))
        {
            while (rgelt < pelt)
                Copy::destroy(rgelt++);
            nActual = 0;
        }
        else
        {
            pelt++;
            m_iter++;
            nActual++;
        }
    }
    if (SUCCEEDED(hr))
    {
        if (pceltFetched)
            *pceltFetched = nActual;
        if (nActual < celt)
            hr = S_FALSE;
    }
    return hr;
}

如果还有任何问题,请参考我的示例代码。

http://download.csdn.net/source/260939

Tags:组件 对象 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接