Condividi tramite


Funzione CoDisconnectContext (combaseapi.h)

Disconnette tutte le connessioni proxy mantenute per conto di tutti i puntatori di interfaccia che puntano agli oggetti nel contesto corrente.

Questa funzione blocca le connessioni fino a quando tutti gli oggetti non vengono disconnessi correttamente o il timeout scade. Solo il contesto che gestisce effettivamente gli oggetti deve chiamare CoDisconnectContext.

Sintassi

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

Parametri

[in] dwTimeout

Tempo in millisecondi dopo il quale CoDisconnectContext restituisce anche se le connessioni proxy per tutti gli oggetti non sono state disconnesse. INFINITE è un valore accettabile per questo parametro.

Valore restituito

Questa funzione può restituire i valori restituiti standard E_FAIL, E_INVALIDARG e E_OUTOFMEMORY, nonché i valori seguenti.

Codice restituito Descrizione
S_OK
Le connessioni proxy per tutti gli oggetti sono state disconnesse correttamente.
RPC_E_TIMEOUT
Non tutte le connessioni proxy sono state eliminate correttamente nel tempo specificato in dwTimeout.
CO_E_NOTSUPPORTED
Impossibile disconnettere il contesto corrente.
CONTEXT_E_WOULD_DEADLOCK
Un oggetto ha tentato di chiamare CoDisconnectContext nel contesto in cui risiede. In questo modo la funzione viene eseguita il timeout e il deadlock se dwTimeout è stato impostato su INFINITE.

Commenti

La funzione CoDisconnectContext viene usata per supportare i servizi di scarico negli host di servizio condivisi in cui è necessario scaricare i file binari del servizio senza influire su altri server COM in esecuzione nello stesso processo. Se si controlla la durata del processo e non si scarica fino all'uscita del processo, l'infrastruttura COM eseguirà automaticamente la pulizia necessaria e non è necessario chiamare questa funzione.

La funzione CoDisconnectContext consente a un server di disconnettere correttamente tutti i client esterni di tutti gli oggetti nel contesto corrente. Non è possibile disconnettere i contesti predefiniti. Per usare CoDisconnectContext, è prima necessario creare un contesto che può essere disconnesso e registrare le factory di classi per gli oggetti da cui si vuole disconnettersi all'interno di tale contesto. È possibile eseguire questa operazione con l'interfaccia IContextCallback .

Se CoDisconnectContext restituisce RPC_E_TIMEOUT, questa operazione non indica che la funzione non ha disconnesso gli oggetti, ma che non tutte le disconnessioni potrebbero essere completate nel tempo specificato da dwTimeout a causa di chiamate in sospeso sugli oggetti. Tutti gli oggetti verranno disconnessi dopo il completamento di tutte le chiamate.

Non è sicuro scaricare la DLL che ospita il servizio finché CoDisconnectContext restituisce S_OK. Se la funzione restituisce RPC_E_TIMEOUT, il servizio può eseguire altre operazioni di pulizia. Il servizio deve chiamare la funzione finché non restituisce S_OK e quindi può scaricare in modo sicuro la DLL.

La funzione CoDisconnectContext esegue le attività seguenti:

  • Chiama CoDisconnectObject su tutti gli oggetti nel contesto corrente.
  • Blocca fino a quando tutti gli oggetti non sono stati disconnessi o il timeout è scaduto.
La funzione CoDisconnectContext presenta le limitazioni seguenti:
  • Le chiamate COM asincrone non sono supportate.
  • Gli oggetti in-process devono essere registrati e abilitati usando il flag di CLSCTX_LOCAL_SERVER oppure non verranno disconnessi.
  • COM+ non è supportato.
  • I puntatori di interfaccia COM sono sensibili al contesto. Pertanto, qualsiasi puntatore dell'interfaccia creato nel contesto da disconnettere può essere usato solo all'interno di tale contesto.

Esempio

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);
}


Requisiti

Requisito Valore
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione combaseapi.h (include Objbase.h)
Libreria Ole32.lib
DLL Ole32.dll

Vedi anche

CoDisconnectObject

IContextCallback