代码概述

下图为实现 ADSI 示例提供程序组件所需代码块的概念表示形式。 下图将介绍各节。 经验丰富的 COM 程序员可能会发现,这是示例提供程序组件的适当概述。 有关详细信息,请参阅代码详细信息

sample provider implementation

以下编号项目对应于图中的块元素。

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