CComObject<EnumType>* pEnum = NULL;
HRESULT hr = CComObject<EnumType>::CreateInstance(&pEnum);
if (FAILED(hr))
return hr;
hr = pEnum->Init(pUnkForRelease, collection);
if (SUCCEEDED(hr))
hr = pEnum->QueryInterface(ppUnk);
if (FAILED(hr))
delete pEnum;
return hr;
}
CreateSTLEnumerator()函数封装了创建CComEnumOnSTL样式的枚举器所必需的初始化和错误处理代码,我们可以这样使用该函数来完成get__NewEnum()方法:
typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,
_Copy<VARIANT>, std::vector<CComVariant> > VarVarEnum;
std::vector<CComVariant> m_vec;
STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
{
return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
}
整个get__NewEnum就一条语句:
return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
显得干净利落。
让我们来看一个例子:
该例子的功能很简单,我们的COM组件内部有一个std::vector<VARIANT>,我需要将该vector内的数据以枚举器的形式暴露给客户端。该例子的实作步骤如下(编程环境为VS2002,也就是VC7+ATL7):
1、 建立一个新的名为ATLEnum1的解决方案,在其下添加一个新的类型为ATL项目名为ATLEnum1的项目,在项目属性设置中,取消其“属性化”选择,勾上“允许合并proxy/stub代码的复选框,点完成建立项目。
2、 切换到“类视图”,按照如下所示给该工程添加一个模板为ATL简单对象名为ATLEnum的类:

图 ATLEnum-01