Поддержка ранней привязки
В следующем примере кода представлен сценарий с поддержкой ранней привязки.
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
В этом примере кода два компонента расширения расширяют объект пользователя . Каждое расширение публикует свой собственный интерфейс. Каждое расширение не распознает другой интерфейс расширения; только ADSI распознает существование обоих расширений. Каждое расширение делегирует iUnknown в ADSI. ADSI выступает в качестве агрегатора для обоих расширений и любых других будущих расширений. Запрос интерфейса из любого расширения или из ADSI дает тот же согласованный результат.
В следующей процедуре описывается создание расширения.
Шаг 1. Добавление агрегирования в компонент
Следуйте спецификации COM для добавления агрегирования в компонент. В сводке необходимо принять запросы pUnknown к компоненту во время CreateInstance и делегировать pUnknown iggregator iUnknown, если компонент агрегирован.
Шаг 2. Регистрация расширения
Теперь необходимо решить, какой класс каталога следует расширить. Для этого нельзя использовать те же интерфейсы, что и для интерфейса ADSI, например IADsUser, IADsComputer. Объекты каталогов сохраняются в каталоге, а расширение и ADSI выполняются на клиентском компьютере. Примеры объектов каталога : пользователь, компьютер, printQueue, service Подключение ionPoint и nTDSService. Вы можете добавить новый класс в Active Directory и создать новое расширение для этого нового класса.
Ключи реестра используются для связывания имени класса каталога с компонентами расширения ADSI. На следующем рисунке представлен существующий макет реестра, а также новые разделы.
- Новый ключ с именем Extensions содержит список ключей, каждый из которых представляет класс в каталоге. Каждый класс, например пользователь, printQueue или компьютер, поддерживает список вложенных ключей.
- Каждый подраздел содержит CLSID компонента расширения ADSI.
- Каждый подраздел 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 может отличаться от расширения 2. Объект, когда активен, поддерживает интерфейсы агрегата (ADSI) и все интерфейсы, предоставляемые расширением 1 и extension2 агрегата. Разрешение конфликтующих интерфейсов (один и тот же интерфейс, поддерживаемый агрегатом и агрегатами или несколькими агрегатами), определяется приоритетами расширений.
Вы также можете связать расширение CLSID с несколькими именами классов объектов. Например, расширение может расширить объекты пользователя и контакта .
Примечание.
Поведение расширения добавляется в класс для каждого объекта, а не в экземпляре каждого объекта.
Рекомендуется зарегистрировать расширения, как и любые другие 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;
}