代码概述
下图为实现 ADSI 示例提供程序组件所需代码块的概念表示形式。 下图将介绍各节。 经验丰富的 COM 程序员可能会发现,这是示例提供程序组件的适当概述。 有关详细信息,请参阅代码详细信息。
以下编号项目对应于图中的块元素。
- 加载 DLL(Libmain.cpp、Guid.cpp)。 DLL 的入口点。 两个提供程序对象的类工厂静态对象定义:Guid.cpp 包含各种示例提供程序组件对象的实现的 CLSID 定义。
- 提供程序对象类工厂和创建代码(Cprovcf.cpp、Cprov.cpp、Stdfact.cpp)。 提供程序对象是指在名字对象绑定操作期间支持 IParseDisplayName 的对象,如示例提供程序组件中的“查找和绑定”所述。
- 绑定到对象 (Getobj.cpp)。 此代码会调用分析程序以确保给定 ADsPath 的语法正确,然后执行从 ADsPath 到作为 Active Directory 对象而创建的项目的本机目录服务路径的所有必要映射。 此代码会查找该类型的对象的架构定义,并填写必需属性。 创建 Active Directory 对象后,将为调用方检索指向 IUnknown 的接口指针。
- 提供程序命名空间的分析器 (Parse.cpp)。 它是项目 3 调用的代码。 分析程序会确保传入的 ADsPath 字符串在语法上适合自己的命名空间。
- 命名空间对象的类工厂、创建和枚举(Cnamcf.cpp、Cnamesp.cpp、Cenumns.cpp)。 命名空间对象是一个容器对象,并可通过枚举该对象来查找此命名空间的所有根节点对象。
- 泛型 Active Directory 对象的类工厂和创建代码,以及泛型 ADs 容器对象的创建与枚举代码(Cgenobj.cpp、Cenumobj.cpp、Common.cpp、Core.cpp)。 创建 Active Directory 对象时,将执行此代码。
- 筛选和枚举 VARIANT(Cenumvar.cpp、Object.cpp)。 在 ADSI 中管理单个类型的一系列 VARIANT 元素时,将使用此代码。
- 全局变量 (Globals.cpp)。 命名空间关键字以及从本机数据格式到 ADs 自动化 VARIANT 类型的语法映射结构均会在此处定义。
- 封送/取消封送数据(Pack.cpp、Property.cpp、Smpoper.cpp)。 将对象的属性加载到属性缓存中时,会将本机数据格式转换为受支持的自动化 VARIANT 类型集。 在内存中复制、删除或移动附带指针的结构时,必须执行针对数据的其他特殊处理。
- 属性缓存 (Cprops.cpp)。 缓存属性是 ADSI 环境的一项功能。 IADs::GetInfo、IADs::GetInfoEx 和 IADs::SetInfo 方法将对属性缓存执行操作。
- 内存管理 (Memory.cpp)。 使用一组内存函数来分配和释放内存,可让示例提供程序组件跟踪内存使用情况并阻止内存泄漏。
- 架构对象和管理(Cschobj.cpp、Cprpobj.cpp、Cclsobj.cpp、Cenumsch.cpp)。 其中包括用于创建、管理和枚举架构对象的例程。 除能枚举架构类容器对象之外,其中还包括架构类对象、属性对象和语法对象。
- 特定于操作系统的调用 (RegDSAPI.cpp)。 其中包括引用本机操作系统的所有调用。 除其他函数外,还包括用于打开、关闭、读取和修改对象以及访问架构和属性数据的函数。 示例提供程序组件使用注册表来模拟目录层次结构。 提供程序作者仅对函数名称非常感兴趣。
- IDispatch 实现 (Cdispmgr.cpp)。 此代码可访问类型库数据,以允许以与自动化兼容的方式来调用接口方法。