Compatibilidad con enlaces anticipados
En el ejemplo de código siguiente se presenta un escenario con compatibilidad con enlaces anticipados.
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
En este ejemplo de código, dos componentes de extensión extienden un objeto de usuario . Cada extensión publica su propia interfaz. Cada extensión no reconoce la otra interfaz de extensión; solo ADSI reconoce la existencia de ambas extensiones. Cada extensión delega su IUnknown a ADSI. ADSI actúa como agregador para ambas extensiones y cualquier otra extensión futura. La consulta de una interfaz desde cualquier extensión, o desde ADSI, produce el mismo resultado coherente.
En el procedimiento siguiente se describe cómo crear una extensión.
Paso 1: Agregar agregación al componente
Siga la especificación COM para agregar agregación al componente. En resumen, debe aceptar las solicitudes pUnknown al componente durante CreateInstance y delegar pUnknown en el IUnknown del agregador si se agrega el componente.
Paso 2: Registrar la extensión
Ahora debe decidir qué clase de directorio extender. No puede usar las mismas interfaces para lograr esto que usaría para una interfaz ADSI, por ejemplo, IADsUser, IADsComputer. Los objetos de directorio se conservan en el directorio, mientras que la extensión y ADSI se ejecutan en el equipo cliente. Los ejemplos de objetos de directorio son user, computer, printQueue, serviceConnectionPoint y nTDSService. También puede agregar una nueva clase en Active Directory y crear una nueva extensión para esta nueva clase.
Las claves del Registro se usan para asociar un nombre de clase de directorio a los componentes de extensión ADSI. En la ilustración siguiente se representa el diseño del Registro existente, así como nuevas claves.
- Una nueva clave, denominada Extensions, contiene una lista de claves, cada una de las cuales representa una clase en el directorio. Cada clase, por ejemplo, user, printQueue o computer, mantiene una lista de subclaves.
- Cada subclave contiene el CLSID del componente de extensión ADSI.
- Cada subclave CLSID contiene una entrada de cadena que permite varios valores. Solo debe enumerar las interfaces que participan en la agregación.
Nota
Los objetos de extensión siguen siendo necesarios para registrar claves COM estándar.
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
Ejemplo
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 lista de interfaces de Extension1 puede ser diferente de la de Extension2. El objeto, cuando está activo, admite las interfaces del agregador (ADSI) y todas las interfaces proporcionadas por extension1 y extension2 del agregado. La resolución de interfaces en conflicto (la misma interfaz admitida por el agregador y los agregados o por varios agregados) viene determinada por prioridades de las extensiones.
También puede asociar la extensión CLSID con varios nombres de clase de objeto. Por ejemplo, la extensión puede extender los objetos de usuario y contacto .
Nota
El comportamiento de la extensión se agrega en una clase por objeto, no en una instancia por objeto.
Como procedimiento recomendado, registre las extensiones, como haría con cualquier otro componente COM, con una llamada a la función DllRegisterSvr . Proporcione también un recurso para anular el registro de la extensión con la función DllUnregisterServer .
En el ejemplo de código siguiente se muestra cómo registrar una extensión.
/////
// 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;
}