Unterstützung für frühzeitige Bindung

Im folgenden Codebeispiel wird ein Szenario mit Unterstützung für frühzeitige Bindung dargestellt.

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

In diesem Codebeispiel erweitern zwei Erweiterungskomponenten ein Benutzerobjekt . Jede Erweiterung veröffentlicht ihre eigene Schnittstelle. Jede Erweiterung erkennt die andere Erweiterungsschnittstelle nicht. nur ADSI erkennt die Existenz beider Erweiterungen. Jede Erweiterung delegiert ihre IUnknown an ADSI. ADSI fungiert als Aggregator sowohl für Erweiterungen als auch für alle anderen zukünftigen Erweiterungen. Das Abfragen einer Schnittstelle aus einer beliebigen Erweiterung oder von ADSI ergibt das gleiche konsistente Ergebnis.

Im folgenden Verfahren wird beschrieben, wie eine Erweiterung erstellt wird.

Schritt 1: Hinzufügen von Aggregation zu Ihrer Komponente

Befolgen Sie die COM-Spezifikation, um Ihrer Komponente Aggregation hinzuzufügen. Zusammenfassend müssen Sie die pUnknown-Anforderungen an Ihre Komponente während CreateInstance akzeptieren und die pUnknown an den IUnknown des Aggregators delegieren, wenn die Komponente aggregiert ist.

Schritt 2: Registrieren Ihrer Erweiterung

Nun müssen Sie entscheiden, welche Verzeichnisklasse erweitert werden soll. Sie können nicht die gleichen Schnittstellen verwenden, die Sie für eine ADSI-Schnittstelle verwenden würden, z. B. IADsUser, IADsComputer. Verzeichnisobjekte werden im Verzeichnis beibehalten, während Ihre Erweiterung und ADSI auf dem Clientcomputer ausgeführt werden. Verzeichnisobjektbeispiele sind Benutzer, Computer, printQueue, serviceConnectionPoint und nTDSService. Sie können eine neue Klasse in Active Directory hinzufügen und auch eine neue Erweiterung für diese neue Klasse erstellen.

Sie verwenden Registrierungsschlüssel, um den ADSI-Erweiterungskomponenten einen Verzeichnisklassennamen zuzuordnen. Die folgende Abbildung stellt das vorhandene Registrierungslayout sowie einen neuen Schlüssel dar.

  • Ein neuer Schlüssel mit dem Namen Erweiterungen enthält eine Liste von Schlüsseln, die jeweils eine Klasse im Verzeichnis darstellen. Jede Klasse, z. B . Benutzer, printQueue oder Computer, verwaltet eine Liste von Unterschlüsseln.
  • Jeder Unterschlüssel enthält die CLSID der ADSI-Erweiterungskomponente.
  • Jeder CLSID-Unterschlüssel enthält einen Zeichenfolgeneintrag, der mehrere Werte zulässt. Sie sollten nur die Schnittstellen auflisten, die an der Aggregation beteiligt sind.

Hinweis

Erweiterungsobjekte sind weiterhin erforderlich, um COM-Standardschlüssel zu registrieren.

 

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

Beispiel

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}

Die Liste der Schnittstellen von Extension1 kann sich von der Liste von Extension2 unterscheiden. Das -Objekt, wenn es aktiv ist, unterstützt die Schnittstellen des Aggregators (ADSI) und alle Schnittstellen, die von extension1 und Extension2 des Aggregats bereitgestellt werden. Die Auflösung konfliktierender Schnittstellen (dieselbe Schnittstelle, die sowohl vom Aggregator als auch von den Aggregaten oder von mehreren Aggregaten unterstützt wird) wird durch die Prioritäten der Erweiterungen bestimmt.

Sie können Ihre CLSID-Erweiterung auch mehreren Objektklassennamen zuordnen. Beispielsweise kann Ihre Erweiterung sowohl das Benutzer - als auch das Kontaktobjekt erweitern.

Hinweis

Das Erweiterungsverhalten wird für eine Objektklasse hinzugefügt, nicht für eine objektspezifische instance.

 

Als bewährte Methode registrieren Sie Ihre Erweiterungen wie alle anderen COM-Komponenten mit einem Aufruf der DllRegisterSvr-Funktion . Stellen Sie auch eine Möglichkeit zum Aufheben der Registrierung Ihrer Erweiterung mit der DllUnregisterServer-Funktion bereit.

Im folgenden Codebeispiel wird gezeigt, wie eine Erweiterung registriert wird.

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