Partager via


Exposer des événements dans le Kit de développement logiciel (SDK) Visual Studio

Visual Studio vous permet de créer des événements en utilisant l’automatisation. Nous vous recommandons d’approvisionner des événements pour les projets et les éléments de projet.

Les événements sont récupérés par les consommateurs d’automatisation à partir de l’objet Events ou GetObject (par exemple, GetObject("EventObjectName")). L’environnement appelle IDispatch::Invoke en utilisant les indicateurs DISPATCH_METHOD ou DISPATCH_PROPERTYGET pour renvoyer un événement.

Le processus suivant explique comment les événements spécifiques au VSPackage sont renvoyés.

  1. L’environnement démarre.

  2. Il lit dans le registre tous les noms de valeurs sous les clés Automation, AutomationEvents et AutomationProperties de tous les VSPackages, et stocke ces noms dans une table.

  3. Un consommateur d’automatisation appelle, dans cet exemple, DTE.Events.AutomationProjectsEvents ou DTE.Events.AutomationProjectItemsEvents.

  4. L’environnement recherche le paramètre de chaîne dans la table et charge le VSPackage correspondant.

  5. L’environnement appelle la méthode GetAutomationObject en utilisatn le nom transmis dans l’appel ; dans cet exemple, AutomationProjectsEvents ou AutomationProjectItemsEvents.

  6. Le VSPackage crée un objet racine qui possède des méthodes telles que get_AutomationProjectsEvents et get_AutomationProjectItemEvents, puis renvoie un pointeur IDispatch vers l’objet.

  7. L’environnement appelle la méthode appropriée en fonction du nom transmis dans l’appel d’automatisation.

  8. La méthode get_ crée un autre objet événement basé sur IDispatch qui implémente les interfaces IConnectionPointContainer et IConnectionPoint et renvoie un IDispatchpointer à l’objet.

    Pour exposer un événement en utilisant l’automatisation, vous devez répondre à GetAutomationObject et surveiller les chaînes que vous ajoutez au registre. Dans l’exemple de projet de base, les chaînes sont BscProjectsEvents et BscProjectItemsEvents.

Entrées de registre de l’exemple de projet de base

Cette section indique où ajouter des valeurs d’événements d’automatisation dans le registre.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]

AutomationProjectEvents = Renvoie l’objet AutomationProjectEvents.

AutomationProjectItemEvents = Renvoie l’objet AutomationProjectItemsEvents.

Nom Type Plage Description
Par défaut (@) REG_SZ Inutilisé Inutilisé. Vous pouvez utiliser le champ de données pour la documentation.
AutomationProjectsEvents REG_SZ Nom de votre objet d’événement. Seul le nom de clé est pertinent. Vous pouvez utiliser le champ de données pour la documentation.

Cet exemple provient de l’exemple de projet de base.
AutomationProjectItemEvents REG_SZ Nom de votre objet d’événement Seul le nom de clé est pertinent. Vous pouvez utiliser le champ de données pour la documentation.

Cet exemple provient de l’exemple de projet de base.

Lorsque l’un de vos objets d’événement est demandé par un consommateur d’automatisation, créez un objet racine qui possède des méthodes pour tous les événements pris en charge par votre VSPackage. L’environnement appelle la méthode get_ appropriée sur cet objet. Par exemple, si DTE.Events.AutomationProjectsEvents est appelé, la méthode get_AutomationProjectsEvents de l’objet racine est invoquée.

Événements de projet Visual Studio

Modèle d’automatisation pour les événements

La classe CProjectEventsContainer représente l’objet source pour BscProjectsEvents et CProjectItemsEventsContainer représente l’objet source pour BscProjectItemsEvents.

Dans la plupart des cas, vous devez renvoyer un nouvel objet pour chaque demande d’événement, car la plupart des objets d’événement nécessitent un objet filtre. Lorsque vous lancez votre événement, vérifiez ce filtre pour vous assurer que le gestionnaire d’événement est appelé.

AutomationEvents.h et AutomationEvents.cpp contiennent les déclarations et les implémentations des classes de la table suivante.

Classe Description
CAutomationEvents Implémente un objet racine d’événement, récupéré à partir de l’objet DTE.Events .
CProjectsEventsContainer et CProjectItemsEventsContainer Implémenter les objets sources d’événements qui lancent les événements correspondants.

L’exemple de code suivant montre comment répondre à une demande d’objet d’événement.

STDMETHODIMP CVsPackage::GetAutomationObject(
    /* [in]  */ LPCOLESTR       pszPropName,
    /* [out] */ IDispatch **    ppIDispatch)
{
    ExpectedPtrRet(ppIDispatch);
    *ppIDispatch = NULL;

    if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0)
        //Is the requested name our Projects object?
    {
        return GetAutomationProjects(ppIDispatch);
        // Gets our Projects object.
    }
    else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0)
        //Is the requested name our ProjectsEvents object?
    {
        return CAutomationEvents::GetAutomationEvents(ppIDispatch);
          // Gets our ProjectEvents object.
    }
    else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0)  //Is the requested name our ProjectsItemsEvents object?
    {
        return CAutomationEvents::GetAutomationEvents(ppIDispatch);
          // Gets our ProjectItemsEvents object.
    }
    return E_INVALIDARG;
}

Dans le code ci-dessus, g_wszAutomationProjects est le nom de votre collection de projets (FigProjects), g_wszAutomationProjectsEvents (FigProjectsEvents) et g_wszAutomationProjectItemsEvents (FigProjectItemEvents) sont les noms des événements du projet et des événements des éléments du projet qui proviennent de votre implémentation VSPackage.

Les objets d’événement sont récupérés à partir de la même position centrale, l’objet DTE.Events. De cette manière, tous les objets d’événements sont regroupés, de sorte que l’utilisateur final n’a pas à parcourir l’ensemble du modèle d’objets pour trouver un événement spécifique. Vous pourrez ainsi fournir vos objets VSPackage spécifiques, au lieu de devoir implémenter votre code pour les événements à l’échelle du système. Cependant, pour l’utilisateur final, qui doit trouver un événement pour votre interface ProjectItem, il n’est pas évident de savoir d’où l’objet événement est récupéré.