é um mecanismo formal utilizado pelo COM para descrever o conjunto de métodos suportados
por uma interface
Interface Definition Language" - IDL
desenvolvida pelo "Open Software
Foundation's Distributed Computing
Environment" (OSF DCE)
VTABLE
Um determinado cliente
possui o ponteiro de
interface (A) para essa
interface (I)
ponteiro de interface (A)
aponta, na realidade, para
um ponteiro (B) dentro do
objeto
ponteiro (B), por sua vez,
aponta para uma tabela
(vtable) que contém ponteiros.
possui um ponteiro para cada
método contido nessa interface
(M1, M2, M3, M4, M5, M6)
Quando um cliente invoca
um método da interface a
estrutura de ponteiros é
percorrida e o método
correto é executado
INTERFACE
FUNDAMENTAL IUnknown
QueryInterface
possibilita ao cliente
obter o ponteiro de uma
outra interface do objeto
O primeiro ponteiro de interface
para um objeto pode ser adquirido
por um cliente quando, por
exemplo, ele o cria
Uma vez obtido este ponteiro
inicial, o cliente, através do
método QueryInterface, é capaz
de adquirir os demais ponteiros
de interfaces cujos métodos ele
necessite invocar
AddRef/Release
quando um cliente deseja
utilizar um objeto, ele deve
instanciá-lo explicitamente, mas
não poderá destruir esta
instância diretamente
Annotations:
Isto ocorre porque ao dar início a um objeto, ele adquire um ponteiro de
uma de suas interfaces o qual poderia ter sido passado para outro cliente
ao dar início a um objeto, ele
adquire um ponteiro de uma
de suas interfaces o qual
poderia ter sido passado para
outro cliente
segundo cliente pode usar
esse ponteiro (recebido do
primeiro cliente) para invocar
um método do mesmo objeto,
podendo também repassá-lo
para um terceiro cliente e
assim por diante
Cada objeto COM mantém um contador de referência. Sempre que o objeto
passar adiante um ponteiro para uma de suas interfaces, ele soma 1 ao seu
contador de referência (na verdade o objeto mantém um contador de
referência para cada uma das interfaces do objeto). Se um cliente passa um
ponteiro de interface para um outro cliente, aquele que o recebe deve
invocar o método AddRef através deste ponteiro. Isto faz com que o objeto
incremente seu contador de referência. Indiferentemente de como um
cliente adquiriu este ponteiro, ele deve sempre invocar o método Release,
através deste ponteiro, quando não necessitar mais dele. A execução deste
método causa um decremento do contador de referência deste objeto. O
objeto, usualmente, se destrói quando o contador de referência chega a
zero.