Criando a tabela de interface global

Use a seguinte chamada para criar o objeto de tabela de interface global e obter um ponteiro para IGlobalInterfaceTable:

HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
                 NULL,
                 CLSCTX_INPROC_SERVER,
                 IID_IGlobalInterfaceTable,
                 (void **)&gpGIT);
if (hr != S_OK) {
  exit(0); // Handle errors here.
}

Observação

Ao criar o objeto de tabela de interface global usando a chamada anterior, é necessário vincular à biblioteca uuid.lib. Isso resolverá os símbolos externos CLSID_StdGlobalInterfaceTable e IID_IGlobalInterfaceTable.

 

Há uma única instância da tabela de interface global por processo, portanto, todas as chamadas para essa função em um processo retornam a mesma instância.

Após a chamada para a função CoCreateInstance, registre a interface do apartamento em que reside com uma chamada para o método RegisterInterfaceInGlobal. Esse método fornece um cookie que identifica a interface e sua localização. Um apartamento que procura um ponteiro para essa interface chama o método GetInterfaceFromGlobal com esse cookie, e a implementação fornece um ponteiro de interface para o apartamento de chamada. Para revogar o registro global da interface, qualquer apartamento pode chamar o método RevokeInterfaceFromGlobal.

Um exemplo simples de uso de IGlobalInterfaceTable seria quando você deseja passar um ponteiro de interface em um objeto em um apartamento de thread único (STA) para um thread de trabalho em outro apartamento. Em vez de ter que agrupá-lo em um fluxo e passar o fluxo para o thread de trabalho como um parâmetro de thread, IGlobalInterfaceTable permite que você simplesmente passe um cookie.

Quando você registra a interface na tabela de interface global, você obtém um cookie que você pode usar em vez de passar o ponteiro real (sempre que precisar passar o ponteiro), seja para um parâmetro nonmethod que está indo para outro apartamento (como um parâmetro para ThreadProc através de CreateThread) ou para a memória em processo acessível fora do seu apartamento.

É necessário cuidado porque o uso de interfaces globais coloca a carga extra sobre o programador de gerenciar problemas como condições de corrida e exclusão mútua, que estão associados ao acesso ao estado global de vários threads simultaneamente.

COM fornece uma implementação padrão da interface IGlobalInterfaceTable. É altamente recomendável que você use essa implementação padrão porque ela fornece funcionalidade completa de thread-safe.

Quando usar a Tabela de Interface Global