Partager via


Prise en charge des liaisons anticipées

L’exemple de code suivant présente un scénario avec une prise en charge précoce de la liaison.

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

Dans cet exemple de code, deux composants d’extension étendent un objet utilisateur . Chaque extension publie sa propre interface. Chaque extension ne reconnaît pas l’autre interface d’extension ; seul ADSI reconnaît l’existence des deux extensions. Chaque extension délègue son IUnknown à ADSI. ADSI agit en tant qu’agrégateur pour les deux extensions et pour toutes les autres extensions futures. L’interrogation d’une interface à partir d’une extension ou d’ADSI génère le même résultat cohérent.

La procédure suivante décrit comment créer une extension.

Étape 1 : Ajouter une agrégation à votre composant

Suivez la spécification COM pour ajouter l’agrégation à votre composant. En résumé, vous devez accepter les demandes pUnknown adressées à votre composant pendant CreateInstance, et déléguer le pUnknown au IUnknown de l’agrégateur si le composant est agrégé.

Étape 2 : Inscrire votre extension

Vous devez maintenant choisir la classe d’annuaire à étendre. Pour ce faire, vous ne pouvez pas utiliser les mêmes interfaces que celles que vous utiliseriez pour une interface ADSI, par exemple IADsUser, IADsComputer. Les objets d’annuaire sont conservés dans le répertoire, tandis que votre extension et ADSI s’exécutent sur l’ordinateur client. Les exemples d’objets d’annuaire sont user, computer, printQueue, serviceConnectionPoint et nTDSService. Vous pouvez ajouter une nouvelle classe dans Active Directory et créer une extension pour cette nouvelle classe.

Vous utilisez des clés de Registre pour associer un nom de classe d’annuaire aux composants de l’extension ADSI. La figure suivante représente la disposition du Registre existante, ainsi que les nouvelles clés.

  • Une nouvelle clé, appelée Extensions, contient une liste de clés, chacune représentant une classe dans le répertoire. Chaque classe, par exemple utilisateur, printQueue ou ordinateur, gère une liste de sous-clés.
  • Chaque sous-clé contient le CLSID du composant d’extension ADSI.
  • Chaque sous-clé CLSID contient une entrée de chaîne qui autorise plusieurs valeurs. Vous devez uniquement répertorier les interfaces qui participent à l’agrégation.

Notes

Les objets d’extension sont toujours nécessaires pour inscrire des clés COM standard.

 

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

Exemple

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}

La liste des interfaces d’Extension1 peut être différente de celle d’Extension2. L’objet, lorsqu’il est actif, prend en charge les interfaces de l’agrégateur (ADSI) et toutes les interfaces fournies par les extensions Extension1 et Extension2 de l’agrégat. La résolution des interfaces en conflit (la même interface prise en charge par l’agrégateur et les agrégats ou par plusieurs agrégats) est déterminée par les priorités des extensions.

Vous pouvez également associer votre extension CLSID à plusieurs noms de classes d’objets. Par exemple, votre extension peut étendre les objets utilisateur et contact .

Notes

Le comportement d’extension est ajouté sur une classe par objet, et non sur un instance par objet.

 

Il est recommandé d’inscrire vos extensions, comme vous le feriez pour n’importe quel autre composant COM, avec un appel à la fonction DllRegisterSvr . Fournissez également une fonctionnalité permettant d’annuler l’inscription de votre extension avec la fonction DllUnregisterServer .

L’exemple de code suivant montre comment inscrire une extension.

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