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.
L’environnement démarre.
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.
Un consommateur d’automatisation appelle, dans cet exemple,
DTE.Events.AutomationProjectsEvents
ouDTE.Events.AutomationProjectItemsEvents
.L’environnement recherche le paramètre de chaîne dans la table et charge le VSPackage correspondant.
L’environnement appelle la GetAutomationObject méthode à l’aide du nom passé dans l’appel ; dans cet exemple,
AutomationProjectsEvents
ouAutomationProjectItemsEvents
.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.L’environnement appelle la méthode appropriée en fonction du nom transmis à l’appel Automation.
La
get_
méthode crée un autre objet d’événement basé sur IDispatch qui implémente l’interfaceIConnectionPointContainer
et l’interfaceIConnectionPoint
et retourne unIDispatchpointer
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.
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é.