Revisitando regras de agregação COM com extensões ADSI
A seguir está uma breve revisão das regras de agregação COM e extensão ADSI.
O método CreateInstance retorna um ponteiro para uma interface IUnknown, da seguinte maneira, que não delega nenhuma chamada de função ao agregador.
O método IUnknown::QueryInterface retorna ponteiros para as interfaces que ele oferece suporte e erros para interfaces que ele não suporta.
O método IUnknown::AddRef incrementa a contagem de referência no próprio objeto de extensão agregada.
O método IUnkown::Release diminui a contagem de referência no próprio objeto de extensão agregado e se destrói quando a contagem de referência é 0.
O objeto de extensão deve armazenar o ponteiro IUnknown do agregador, como m_pOuterUnknown, durante a implementação do método CreateInstance.
Todas as interfaces que o objeto de extensão suporta, incluindo IADsExtension, devem herdar de IUnknown, que delega todas as chamadas de função de volta ao agregador.
- IUnknown::QueryInterface chama "m_pOuterUnknown-QueryInterface>"
- IUnknown::AddRef chama "m_pOuterUnknown-AddRef>"
- IUnkown::Release chama "m_pOuterUnknown-Release>"
Os gravadores de extensão podem escolher qualquer implementação interna que preferirem, desde que obedeçam às regras de agregação COM padrão. Lembre-se de que um objeto de extensão não precisa funcionar como um objeto autônomo. As extensões são projetadas para funcionar como agregados. No entanto, uma extensão pode ser gravada para funcionar como um objeto autônomo e como um agregado.
Além do suporte de agregação COM padrão, um objeto de extensão pode oferecer suporte a IADsExtension para recursos mais avançados. Se houver suporte para vinculação tardia, a extensão deverá:
- Delegue funções para IDispatch de volta ao agregador.
- Implemente a interface IDispatch em IADsExtension.