早期绑定支持
以下代码示例演示了具有早期绑定支持的场景。
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 接口的相同接口用于完成此操作,例如 IADsUser 和 IADsComputer。 目录对象会保留在目录中,而扩展和 ADSI 则会在客户端计算机上运行。 目录对象示例为 user、computer、printQueue、serviceConnectionPoint 和 nTDSService。 此外,还可在 Active Directory 中添加新类并为此新类创建新的扩展。
使用注册表项将目录类名称与 ADSI 扩展组件相关联。 下图表示现有注册表布局和新键。
- 名为 Extensions 的新键,其中包含键列表,且每个键均表示目录中的某个类。 每个类(例如 user、printQueue 或 computer)均维护有子项列表。
- 每个子项均包含 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 扩展与多个对象类名相关联。 例如,扩展可同时扩展 user 和 contact 对象。
注意
扩展行为会按每个对象类进行添加,而不是按每个对象实例来添加。
最佳做法是像注册任意其他 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;
}