65.9K
CodeProject 正在变化。 阅读更多。
Home

COM 集合

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (7投票s)

2002年2月21日

CPOL

3分钟阅读

viewsIcon

211802

downloadIcon

1238

类似于 Visual Basic 的 Collection 对象的 COM 集合

引言

Visual Basic 有一个非常棒的对象叫做 Collection,它是 VBA 类型库的一部分。在 VC++ 中,我们没有类似的object,这很遗憾(依我之见)。

我搜索了 MSDN,结果发现有一个名为 ATLCollections 的示例。这个项目有两个集合。第一个是 BSTR 的集合,第二个是 VARIANT 集合,它使用 CComBSTRa 作为键。 我只想使用 VARIANT 与脚本语言进行比较,所以两者都不是一个好的选择。

下一步是搜索 Web。我找到了 Chris Brooks (clbrooks@micron.com) 编写的一个在 www.widgetware.com 上的,以及 Chris Sells (www.sellsbrothers.com) 编写的另一个。两者都是基于模板的,我不想使用模板。所以我决定编写一个集合对象。

什么是集合?

根据 MSDN,集合对象是一组可以作为一个单元引用的有序项目。 集合对象提供了一种方便的方式来将一组相关的项目引用为单个对象。 集合中的项目或成员只需要通过它们存在于集合中的事实相关联。 集合的成员不必共享相同的数据类型。

可以像创建其他对象一样创建集合。例如

Dim X As New Collection

创建集合后,可以使用 Add 方法添加成员,并使用 Remove 方法删除成员。 可以使用 Item 方法从集合中返回特定成员,而可以使用 For Each...Next 语句迭代整个集合。

这意味着集合是一个 COM 对象,它有 3 个属性和 2 个方法:AddRemoveCountItem_NewEnum,尽管在技术文献中,您可能会发现只有 Count_NewEnum 是该对象被称为集合所必需的。

我的集合定义了由类 CXCollection 实现的接口 IXCollection

IDL 看起来像这样

interface IXCollection : IDispatch
{
[id(1), helpstring("Adds a member to a collection")] 
HRESULT Add([in] VARIANT vItem, [in, optional] VARIANT vKey);

[id(2), helpstring("Removes a member from a collection")]
HRESULT Remove([in] VARIANT vIndex);

[propget, id(3), 
    helpstring("Returns the number of members in a collection")] 
HRESULT Count([out, retval] long * plNumber);

[propget, id(DISPID_VALUE), 
    helpstring("Returns a specific member of a collection "
    "either by position or key")] 
HRESULT Item([in] VARIANT vIndex, [out, retval] VARIANT * pvItem);

[propget, restricted, id(DISPID_NEWENUM), helpstring("Method _NewEnum")] 
HRESULT _NewEnum([out, retval] IUnknown ** ppUnk);
} 

现在让我们稍微谈一下每个方法和属性。

Add

将项目添加到集合中。您可以使用可选的 vKey 参数将项目添加到集合中。如果使用键,则可以使用此键访问各个项目。

移除

按索引或键从集合中删除项目。

Count

返回集合中项目的数量。

项目

按索引或键返回单个项目。如果索引是数字,则从 1 开始。 此属性被赋予标准 DISPID DISPID_VALUE,使其成为“默认”属性,以简化其在 Visual Basic 和脚本语言中的使用。

_NewEnum

返回一个枚举器对象,该对象包含集合项目,允许客户端进行顺序访问。 此属性被分配标准 DISPID DISPID_NEWENUM,此 DISPID 被 Visual Basic 用于实现其 For-Each 语法。

_NewEnum 属性返回一个支持标准 IEnumVARIANT 接口的枚举器对象。 IEnumVARIANT 接口是 Variants 的集合。 当客户端无法或不知道集合中元素的特定类型时,它允许客户端枚举异构的对象和内在类型集合。

源代码

源代码包含 ShoppingCart 项目,该项目实现了集合以及 C++ 和 VBScript 测试应用程序。

环境

  • VC++ 6.0 SP4, Win2000 SP2。


有关集合和枚举器的详细介绍,请参阅 B. Rector、C. Sells 著的“ATL Internals” 和 R. Grimes 著的“Professional ATL COM Programming”。

本代码和信息“按原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于对适销性和/或特定用途适用性的暗示保证。

© . All rights reserved.