早期绑定支持

以下代码示例演示了具有早期绑定支持的场景。

Dim x as IADsUser
Dim y as IADsExt1
Dim z as IADsExt2
 
Set x = GetObject("LDAP://CN=JeffSmith, OU=Sales, 
                   DC=Fabrikam,DC=COM")
x.SetPassword("newPassword")
 
Set y = x
y.MyNewMethod( "\\srv\public")
y.MyProperty = "Hello World"
 
Set z = y
z.OtherMethod()
z.OtherProperty = 4362
 
Debug.Print x.LastName
 
Set z = GetObject("LDAP://CN=Jeff,OU=Engr, 
                   DC=Fabrikam,DC=COM")
z.OtherProperty = 5323

在此代码示例中,两个扩展组件将扩展 user 对象。 每个扩展均会发布自己的接口。 每个扩展无法识别另一扩展接口,而仅 ADSI 可识别这两个扩展的存在。 每个扩展均会将其 IUnknown 委托给 ADSI。 ADSI 会充当这两个扩展和所有其他未来扩展的聚合器。 从任一扩展或 ADSI 查询某一接口均会产生相同的一致结果。

以下过程介绍如何创建扩展。

步骤 1:将聚合添加到组件

按照 COM 规范将聚合添加到组件。 总之,必须在 CreateInstance 期间接受向组件发出的 pUnknown 请求,并在聚合组件聚合时将 pUnknown 委托给聚合器的IUnknown

步骤 2:注册扩展

现在,必须确定要扩展的目录类。 不得将用于 ADSI 接口的相同接口用于完成此操作,例如 IADsUserIADsComputer。 目录对象会保留在目录中,而扩展和 ADSI 则会在客户端计算机上运行。 目录对象示例为 usercomputerprintQueueserviceConnectionPointnTDSService。 此外,还可在 Active Directory 中添加新类并为此新类创建新的扩展。

使用注册表项将目录类名称与 ADSI 扩展组件相关联。 下图表示现有注册表布局和新键。

  • 名为 Extensions 的新键,其中包含键列表,且每个键均表示目录中的某个类。 每个类(例如 userprintQueuecomputer)均维护有子项列表。
  • 每个子项均包含 ADSI 扩展组件的 CLSID。
  • 每个 CLSID 子项均包含一个允许有多个值的字符串条目。 仅应列出参与聚合的接口。

注意

注册标准 COM 键仍需使用扩展对象。

 

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         ADS
            Providers
               LDAP
                  Extensions
                     ClassNameA
                        CLSID of ExtensionA1
                           Interfaces = List of interfaces
                        CLSID of ExtensionA2
                           Interfaces = List of interfaces
                     ClassNameB
                        CLSID of ExtensionB1
                           Interfaces = List of interfaces
                        CLSID of ExtensionB2
                           Interfaces = List of interfaces

示例

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         ADs
            Providers
               LDAP
                  Extensions
                     printQueue
                        {9f37f39c-6f49-11d1-8c18-00c04fd8d503}
                           Interfaces = {466841B0-E531-11d1-8718-00C04FD44407}
                                        {466841B1-E531-11d1-8718-00C04FD44407}

Extension1 中的接口列表可与 Extension2 的接口列表不同。 处于活动状态的对象支持聚合器 (ADSI) 的接口以及该聚合的 Extension1 和 Extension2 所提供的所有接口。 解决冲突接口(聚合器和聚合或多个聚合所支持的同一接口)需由扩展的优先级来决定。

此外,还可将 CLSID 扩展与多个对象类名相关联。 例如,扩展可同时扩展 usercontact 对象。

注意

扩展行为会按每个对象类进行添加,而不是按每个对象实例来添加。

 

最佳做法是像注册任意其他 COM 组件一样来注册扩展,同时调用 DllRegisterSvr 函数。 此外还提供了一个工具,而它可通过 DllUnregisterServer 函数来注销扩展。

以下代码示例演示了如何注册扩展。

/////
// Register the class.
///////////////////////
hr = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
                 _T("SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\User\\{E1E3EDF8-48D1-11D2-B22B-0000F87A6B50}"),
 0,
 NULL,
 REG_OPTION_NON_VOLATILE,
 KEY_WRITE,
 NULL,
 &hKey,
 &dwDisposition );
 
///////////////////////////
// Register the Interface.
///////////////////////////
const TCHAR szIf[] = _T("{E1E3EDF7-48D1-11D2-B22B-0000F87A6B50}");
 
hr = RegSetValueEx( hKey, _T("Interfaces"), 0, REG_BINARY, (const BYTE *) szIf, sizeof(szIf) );
 
RegCloseKey(hKey);
return S_OK;
 
}