程序员

上海急召web前端高手,有意者回复任意博文

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

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

cheungmine

2007-10-11

        组件对象模型与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

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheungmine/article/details/1819551
文章标签: class null
个人分类: ATL
想对作者说点什么? 我来说一句

MapLib

2007年10月10日 60KB 下载

COM技术内幕 微软组件对象模型

2009年03月28日 9.28MB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭