Suporte de vinculação antecipada

O exemplo de código a seguir apresenta um cenário com suporte de vinculação inicial em vigor.

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

Neste exemplo de código, dois componentes de extensão estendem um objeto de usuário . Cada extensão publica sua própria interface. Cada extensão não reconhece a outra interface de extensão; apenas a ADSI reconhece a existência de ambas as extensões. Cada extensão delega seu IUnknown ao ADSI. O ADSI atua como um agregador para ambas as extensões e quaisquer outras extensões futuras. Consultar uma interface de qualquer extensão, ou de ADSI, produz o mesmo resultado consistente.

O procedimento a seguir descreve como criar uma extensão.

Etapa 1: Adicionar agregação ao componente

Siga a especificação COM para adicionar agregação ao seu componente. Em resumo, você deve aceitar as solicitações pUnknown para seu componente durante CreateInstance e delegar o pUnknown ao IUnknown do agregador se o componente for agregado.

Etapa 2: Registre sua extensão

Agora você deve decidir qual classe de diretório estender. Você não pode usar as mesmas interfaces para fazer isso que você usaria para uma interface ADSI, por exemplo, IADsUser, IADsComputer. Os objetos de diretório são persistentes no diretório, enquanto sua extensão e ADSI estão sendo executados no computador cliente. Exemplos de objetos de diretório são user, computer, printQueue, serviceConnectionPoint e nTDSService. Você também pode adicionar uma nova classe no Active Directory e criar uma nova extensão para essa nova classe.

Use chaves do Registro para associar um nome de classe de diretório com os componentes de extensão ADSI. A figura a seguir representa o layout do Registro existente, bem como novas chaves.

  • Uma nova chave, chamada Extensões, contém uma lista de chaves, cada uma das quais representa uma classe no diretório. Cada classe, por exemplo, user, printQueue ou computer, mantém uma lista de subchaves.
  • Cada subchave contém o CLSID do componente de extensão ADSI.
  • Cada subchave CLSID contém uma entrada de cadeia de caracteres que permite vários valores. Você só deve listar as interfaces que participam da agregação.

Observação

Os objetos de extensão ainda são necessários para registrar chaves COM padrão.

 

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

Exemplo

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}

A lista de interfaces de Extension1 pode ser diferente da de Extension2. O objeto, quando ativo, suporta as interfaces do agregador (ADSI) e todas as interfaces fornecidas pela Extension1 e Extension2 da agregação. A resolução de interfaces conflitantes (a mesma interface suportada pelo agregador e pelos agregados ou por vários agregados) é determinada pelas prioridades das extensões.

Você também pode associar sua extensão CLSID a vários nomes de classe de objeto. Por exemplo, sua extensão pode estender os objetos de usuário e contato .

Observação

O comportamento de extensão é adicionado em uma classe por objeto, não em uma instância por objeto.

 

Como prática recomendada, registre suas extensões, como faria com qualquer outro componente COM, com uma chamada para a função DllRegisterSvr . Também forneça um recurso para cancelar o registro de sua extensão com a função DllUnregisterServer .

O exemplo de código a seguir mostra como registrar uma extensão.

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