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

Visual Studio vous permet de sourcer des événements à l’aide de l’automatisation. Nous vous recommandons de sourcer 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 de l’objet Events ou GetObject (par exemple, GetObject("EventObjectName")). L’environnement appelle IDispatch::Invoke à l’aide des indicateurs ou DISPATCH_PROPERTYGET des DISPATCH_METHOD indicateurs pour retourner un événement.

Le processus suivant explique comment les événements spécifiques à VSPackage sont retournés.

  1. L’environnement démarre.

  2. Il lit à partir du 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 GetAutomationObject méthode à l’aide du nom passé dans l’appel ; dans cet exemple, AutomationProjectsEvents ou AutomationProjectItemsEvents.

  6. VsPackage crée un objet racine qui a des méthodes telles que get_AutomationProjectsEvents , get_AutomationProjectItemEvents puis retourne un pointeur IDispatch vers l’objet.

  7. L’environnement appelle la méthode appropriée en fonction du nom transmis à l’appel Automation.

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

    Pour exposer un événement à l’aide de l’automatisation, vous devez répondre et GetAutomationObject 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 montre où ajouter des valeurs d’événement Automation au 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 Automation, créez un objet racine qui a des méthodes pour tout événement pris en charge par votre VSPackage. L’environnement appelle la méthode appropriée get_ sur cet objet. Par exemple, si DTE.Events.AutomationProjectsEvents elle est appelée, la get_AutomationProjectsEvents méthode sur l’objet racine est appelée.

Visual Studio project events Modèle Automation 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 retourner un nouvel objet pour chaque demande d’événement, car la plupart des objets d’événement prennent un objet de filtre. Lorsque vous déclenchez votre événement, case activée ce filtre pour vérifier que le gestionnaire d’événements est appelé.

AutomationEvents.h et AutomationEvents.cpp contiennent des déclarations et des implémentations des classes du tableau suivant.

Classe Description
CAutomationEvents Implémente un objet racine d’événement, récupéré à partir de l’objet DTE.Events .
CProjectsEventsContainer et CProjectItemsEventsContainer Implémentez les objets sources d’événements qui déclenchent 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 de projet et des éléments de projet qui sont générés à partir de votre implémentation VSPackage.

Les objets d’événement sont récupérés à partir du même emplacement central, l’objet DTE.Events . De cette façon, tous les objets d’événement sont regroupés afin qu’un utilisateur final n’ait pas à parcourir l’intégralité du modèle objet pour trouver un événement spécifique. Cela vous permet également de fournir vos objets VSPackage spécifiques, au lieu de vous obliger à implémenter votre propre code pour les événements à l’échelle du système. Toutefois, pour l’utilisateur final, qui doit trouver un événement pour votre ProjectItem interface, il n’est pas immédiatement clair à partir de l’endroit où cet objet d’événement est récupéré.