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 |
---|---|
|
Le connessioni proxy per tutti gli oggetti sono state disconnesse correttamente. |
|
Non tutte le connessioni proxy sono state eliminate correttamente nel tempo specificato in dwTimeout. |
|
Impossibile disconnettere il contesto corrente. |
|
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.
- 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 |