使用ICollectionOnSTLImpl,CComEnumOnSTL模板类实现支持vb for each collection的COM

这个例子来自 http://msdn.microsoft.com/zh-cn/library/s8cb31f2.aspx

如果安装了vc9, 源代码可在C:\Program Files\Microsoft Visual Studio 9.0\Samples\1033\AllVCLanguageSamples.zip下的ATLCollections工程里看到

实现原理可在atl internals第8章-collections and enumerators看到

vb的collection对应的com接口需要继承自IDispatch,并且必须含有属性 Count, Item 及_NewItem

vb访问collection有两种方法, 第一种是

for i = 1 to wordObj.count

's = s & wordObj.item(i) & " "

s = s & wordObj(i) & " "

next

这种方法会调用com的Count, Item 属性

第二种为

for each word in wordObj

s = s & word & " "

next

这种方式会调用_NewItem生成一个IEnumXX对象, 而该对象也需要继承自IDispatch,并且有Next, Skip, Reset, Clone之类的方法

atl对这两个类做了包装以便于将stl的容器转换为vb vollection, 其中collection对应ICollectionOnSTLImpl, enumerator对应CComEnumOnSTL