Поделиться через


Поддержка ранней привязки

В следующем примере кода представлен сценарий с поддержкой ранней привязки.

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;
 
}