0
点赞
收藏
分享

微信扫一扫

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


 

=

 

举报

相关推荐

0 条评论