Partager via


Fonction CoDisconnectContext (combaseapi.h)

Déconnecte toutes les connexions proxy qui sont conservées pour le compte de tous les pointeurs d’interface qui pointent vers des objets dans le contexte actuel.

Cette fonction bloque les connexions jusqu’à ce que tous les objets soient correctement déconnectés ou que le délai d’expiration expire. Seul le contexte qui gère réellement les objets doit appeler CoDisconnectContext.

Syntaxe

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

Paramètres

[in] dwTimeout

Temps en millisecondes après lequel CoDisconnectContext retourne même si les connexions proxy de tous les objets n’ont pas été déconnectées. INFINITE est une valeur acceptable pour ce paramètre.

Valeur retournée

Cette fonction peut retourner les valeurs de retour standard E_FAIL, E_INVALIDARG et E_OUTOFMEMORY, ainsi que les valeurs suivantes.

Code de retour Description
S_OK
Les connexions proxy pour tous les objets ont été correctement déconnectées.
RPC_E_TIMEOUT
Toutes les connexions proxy n’ont pas été supprimées dans le délai spécifié dans dwTimeout.
CO_E_NOTSUPPORTED
Le contexte actuel ne peut pas être déconnecté.
CONTEXT_E_WOULD_DEADLOCK
Un objet a essayé d’appeler CoDisconnectContext sur le contexte dans lequel il réside. Cela entraînerait un délai d’expiration et un blocage de la fonction si dwTimeout était défini sur INFINITE.

Remarques

La fonction CoDisconnectContext est utilisée pour prendre en charge le déchargement des services dans les hôtes de service partagé où vous devez décharger les fichiers binaires de votre service sans affecter les autres serveurs COM qui s’exécutent dans le même processus. Si vous contrôlez la durée de vie du processus et que vous ne déchargez pas tant que le processus ne se termine pas, l’infrastructure COM effectue automatiquement le nettoyage nécessaire et vous n’avez pas besoin d’appeler cette fonction.

La fonction CoDisconnectContext permet à un serveur de déconnecter correctement tous les clients externes de tous les objets dans le contexte actuel. Les contextes par défaut ne peuvent pas être déconnectés. Pour utiliser CoDisconnectContext, vous devez d’abord créer un contexte qui peut être déconnecté et inscrire vos fabriques de classes pour les objets dont vous souhaitez vous déconnecter dans ce contexte. Vous pouvez le faire avec l’interface IContextCallback .

Si CoDisconnectContext retourne RPC_E_TIMEOUT, cela n’indique pas que la fonction n’a pas déconnecté les objets, mais que toutes les déconnexions n’ont pas pu être effectuées dans le temps spécifié par dwTimeout en raison d’appels en suspens sur les objets. Tous les objets seront déconnectés une fois tous les appels effectués.

Il n’est pas sûr de décharger la DLL qui héberge le service tant que CoDisconnectContext n’a pas retourné S_OK. Si la fonction retourne RPC_E_TIMEOUT, le service peut effectuer d’autres propre. Le service doit appeler la fonction jusqu’à ce qu’elle retourne S_OK, puis il peut décharger sa DLL en toute sécurité.

La fonction CoDisconnectContext effectue les tâches suivantes :

  • Appelle CoDisconnectObject sur tous les objets du contexte actuel.
  • Bloque jusqu’à ce que tous les objets aient été déconnectés ou que le délai d’expiration ait expiré.
La fonction CoDisconnectContext présente les limitations suivantes :
  • Les appels COM asynchrones ne sont pas pris en charge.
  • Les objets in-process doivent être inscrits et activés à l’aide de l’indicateur CLSCTX_LOCAL_SERVER, sinon ils ne seront pas déconnectés.
  • COM+ n’est pas pris en charge.
  • Les pointeurs d’interface COM respectent le contexte. Par conséquent, tout pointeur d’interface créé dans le contexte à déconnecter ne peut être utilisé que dans ce contexte.

Exemples

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


Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête combaseapi.h (inclure Objbase.h)
Bibliothèque Ole32.lib
DLL Ole32.dll

Voir aussi

CoDisconnectObject

IContextCallback