Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Há três regras principais que regem a implementação do método IUnknown::QueryInterface em um objeto COM:
- Os objetos devem ter identidade.
- O conjunto de interfaces em uma instância de objeto deve ser estático.
- Deve ser possível consultar com êxito qualquer interface em um objeto de qualquer outra interface.
Os objetos devem ter identidade
Para qualquer instância de objeto específica, uma chamada para QueryInterface com IID_IUnknown sempre deve retornar o mesmo valor de ponteiro físico. Isso permite que você chame queryInterface em duas interfaces e compare os resultados para determinar se eles apontam para a mesma instância de um objeto.
O conjunto de interfaces em uma instância de objeto deve ser estático
O conjunto de interfaces acessíveis em um objeto por meio de QueryInterface deve ser estático, não dinâmico. Especificamente, se QueryInterface retornar S_OK para uma determinada IID uma vez, ela nunca deverá retornar E_NOINTERFACE em chamadas subsequentes no mesmo objeto; e se QueryInterface retornar E_NOINTERFACE para uma determinada IID, as chamadas subsequentes para a mesma IID no mesmo objeto nunca deverão retornar S_OK.
Deve ser possível consultar com êxito qualquer interface em um objeto de qualquer outra interface
Ou seja, considerando o seguinte código:
IA * pA = (some function returning an IA *);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB, &pB);
as seguintes regras se aplicam:
Se você tiver um ponteiro para uma interface em um objeto, uma chamada como a seguinte para QueryInterface para essa mesma interface deverá ter êxito:
pA->QueryInterface(IID_IA, ...)Se uma chamada para queryInterface para um segundo ponteiro de interface for bem-sucedida, uma chamada para QueryInterface desse ponteiro para a primeira interface também deverá ser bem-sucedida. Se o pB tiver sido obtido com êxito, o seguinte também deverá ser bem-sucedido:
pB->QueryInterface(IID_IA, ...)Qualquer interface deve ser capaz de consultar qualquer outra interface em um objeto. Se o pB foi obtido com êxito e você consulta com êxito uma terceira interface (IC) usando esse ponteiro, você também deve ser capaz de consultar com êxito para IC usando o primeiro ponteiro, pA. Nesse caso, a seguinte sequência deve ter êxito:
IC * pC = NULL; hr = pB->QueryInterface(IID_IC, &pC); pA->QueryInterface(IID_IC, ...)
As implementações de interface devem manter um contador de referências de ponteiro pendentes para todas as interfaces em um determinado objeto. Você deve usar uma inteiro sem sinal para o contador.
Se um cliente precisar saber que os recursos foram liberados, ele deverá usar um método em alguma interface no objeto com semântica de nível superior antes de chamar IUnknown::Release.
Tópicos relacionados
-
usando e implementando IUnknown