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