ATL 集合向导






4.73/5 (8投票s)
2000年7月31日

199573

1704
ATL 对象向导,用于创建其他 COM 对象集合
引言
有一天晚上,厌倦了手动创建 COM 集合,我创建了一个对象向导来处理繁琐的工作。这个向导将实现流行的 ICollectionOnSTLImpl
接口,为集合提供一些增强功能。向导生成的代码受到书籍“ATL Internals”(Addison-Wesley Pub Co; ISBN: 0201695898)的启发。我信任该书的作者所写的内容,也没有停下来试图完全理解它。但无论如何……让我们继续向导。
注释
您可以选择您的集合基于哪种 STL 容器,以及您的集合将暴露哪些方法,超出 ICollectionOnSTLImpl
提供的标准方法。通常,当我设计集合时,我不希望用户能够自行创建集合。因此,有“不可创建”和“未注册”选项。“未注册”将简单地将 DECLARE_NO_REGISTRY
添加到您的集合的 CoClass 中,但“不可创建”选项在我编写此向导时给我带来了一个真正的问题。ATL 对象向导没有暴露任何方法来让我添加正确的 OBJECT_ENTRY_NON_CREATEABLE
宏到对象映射中。因此,当选择此选项时,我将一个虚假值扔到 OBJECT_ENTRY
宏中,以强制编译错误。开发者需要通过插入正确的宏来纠正这个问题。当选择此选项时,一个可爱的消息框会提醒您这一点。
不足之处
- 我没有时间为每个人创建一个安装包,所以安装是手动但直接的。只需将所有文件(*.dll 除外)复制到您的 "<DevStudioDirectory>\Common\MSDev98\Template\ATL" 目录中,然后将 *.dll 复制并注册到您喜欢的任何位置。下次运行 ATL 对象向导时,您将能够基于我编写的内容创建集合。
- 在所有 typedefs 和 Impls 之下,是集合的核心,
IEnumVARIANT
。一些开发者可能希望使用不同的 IEnumXXX,因此他们需要手动更改代码。 - 此向导不支持 stl::map 容器。它将来会支持。
- 您必须至少编译一次 IDL 文件,然后才能使用此向导。这是因为向导使用项目的 typelib 来发现集合可以包含的 COM 对象。