Função CoDisconnectContext (combaseapi.h)

Desconecta todas as conexões de proxy que estão sendo mantidas em nome de todos os ponteiros de interface que apontam para objetos no contexto atual.

Essa função bloqueia conexões até que todos os objetos sejam desconectados com êxito ou o tempo limite expire. Somente o contexto que realmente gerencia os objetos deve chamar CoDisconnectContext.

Sintaxe

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

Parâmetros

[in] dwTimeout

O tempo em milissegundos após o qual CoDisconnectContext retorna mesmo que as conexões de proxy para todos os objetos não tenham sido desconectadas. INFINITE é um valor aceitável para esse parâmetro.

Retornar valor

Essa função pode retornar os valores retornados padrão E_FAIL, E_INVALIDARG e E_OUTOFMEMORY, bem como os valores a seguir.

Código de retorno Descrição
S_OK
As conexões de proxy para todos os objetos foram desconectadas com êxito.
RPC_E_TIMEOUT
Nem todas as conexões de proxy foram excluídas com êxito no tempo especificado em dwTimeout.
CO_E_NOTSUPPORTED
O contexto atual não pode ser desconectado.
CONTEXT_E_WOULD_DEADLOCK
Um objeto tentou chamar CoDisconnectContext no contexto em que está residindo. Isso faria com que a função atingisse o tempo limite e o deadlock se dwTimeout fosse definido como INFINITE.

Comentários

A função CoDisconnectContext é usada para dar suporte ao descarregamento de serviços em hosts de serviço compartilhado em que você deve descarregar os binários do serviço sem afetar outros servidores COM que estão em execução no mesmo processo. Se você controlar o tempo de vida do processo e não descarregar até que o processo seja encerrado, a infraestrutura COM executará a limpeza necessária automaticamente e você não precisará chamar essa função.

A função CoDisconnectContext permite que um servidor desconecte corretamente todos os clientes externos de todos os objetos no contexto atual. Os contextos padrão não podem ser desconectados. Para usar CoDisconnectContext, primeiro você deve criar um contexto que possa ser desconectado e registrar suas fábricas de classes para objetos dos quais você deseja se desconectar dentro desse contexto. Você pode fazer isso com a interface IContextCallback .

Se CoDisconnectContext retornar RPC_E_TIMEOUT, isso não indicará que a função não desconectou os objetos, mas que nem todas as desconexões poderiam ser concluídas no tempo especificado por dwTimeout devido a chamadas pendentes nos objetos. Todos os objetos serão desconectados depois que todas as chamadas neles forem concluídas.

Não é seguro descarregar a DLL que hospeda o serviço até que CoDisconnectContext retorne S_OK. Se a função retornar RPC_E_TIMEOUT, o serviço poderá executar outras limpo. O serviço deve chamar a função até retornar S_OK e, em seguida, pode descarregar com segurança sua DLL.

A função CoDisconnectContext executa as seguintes tarefas:

  • Chama CoDisconnectObject em todos os objetos no contexto atual.
  • Bloqueia até que todos os objetos tenham sido desconectados ou o tempo limite tenha expirado.
A função CoDisconnectContext tem as seguintes limitações:
  • Não há suporte para chamadas COM assíncronas.
  • Os objetos em processo devem ser registrados e habilitados usando o sinalizador CLSCTX_LOCAL_SERVER ou não serão desconectados.
  • Não há suporte para COM+.
  • Os ponteiros da interface COM diferenciam contexto. Portanto, qualquer ponteiro de interface criado no contexto a ser desconectado só pode ser usado dentro desse contexto.

Exemplos

IContextCallback *icc;
hr = CoCreateInstance(CLSID_ContextSwitcher, NULL, CLSCTX_INPROC_SERVER, IID_IContextCallback, (void**)&icc);

icc->ContextCallback(EnterCallback, NULL, IID_IContextCallback, 5, NULL);

HRESULT __stdcall EnterCallback(ComCallData *pv)
{ 
    return CoRegisterClassObject(...);
}

/* All objects created by the class factories registered in the callback will be put into the newly created context.
To disconnect, re-enter the context, revoke the class factories, and call CoDisconnectContext. */

icc->ContextCallback(DisconnectCallback, NULL, IID_IContextCallback, 5, NULL);

HRESULT __stdcall DisconnectCallback(ComCallData *pv)
{
    CoRevokeClassObject(...);
    return CoDisconnectContext(timeout);
}


Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho combaseapi.h (inclua Objbase.h)
Biblioteca Ole32.lib
DLL Ole32.dll

Confira também

Codisconnectobject

IContextCallback