exposer des événements dans le kit de développement Visual Studio
Visual Studio vous permet de consulter des événements de source à l'aide de l'automation. Nous vous recommandons de les événements de source pour les projets et d'éléments de projet.
Les événements sont récupérés par les consommateurs d'automation de l'objet d' Events ou d' GetObject (« EventObjectName »). L'environnement appelle IDispatch::Invoke à l'aide de les balises d' DISPATCH_METHOD ou d' DISPATCH_PROPERTYGET pour retourner un événement.
Le processus suivant explique comment les événements de VSPackage-détail sont retournés.
Démarrage de l'environnement.
Il lit du Registre tous les noms de la valeur sous les clés d'automation, d'AutomationEvents et AutomationProperties de toutes les VSPackages, et enregistre ces noms dans un tableau.
un consommateur d'automation appelle, dans cet exemple, DTE.Events.AutomationProjectsEvents ou DTE.Events.AutomationProjectItemsEvents.
L'environnement a trouvé le paramètre de chaîne de la table et charge le VSPackage correspondant.
L'environnement appelle la méthode d' GetAutomationObject à l'aide de le nom passé dans l'appel ; dans cet exemple, AutomationProjectsEvents ou AutomationProjectItemsEvents.
Le VSPackage crée un objet racine qui a des méthodes telles que get_AutomationProjectsEvents et get_AutomationProjectItemEvents puis retourne un pointeur IDispatch à l'objet.
l'environnement appelle la méthode appropriée selon le nom passé dans l'appel d'automation.
La méthode d' get_ crée un autre objet événement IDispatch-basé qui implémente à la fois l'interface d' IConnectionPointContainer et l'interface d' IConnectionPoint et retourne un pointeur d'IDispatch à l'objet.
Pour exposer un événement à l'aide de l'automation, vous devez répondre à GetAutomationObject et à surveiller pour les chaînes que vous ajoutez au Registre. dans l'exemple de base de projet, les chaînes sont « BscProjectsEvents » et « BscProjectItemsEvents ».
entrées du Registre de l'exemple de base de projet
Cette section indique où ajouter des valeurs d'événement d'automation au Registre.
[HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio\8.0\Packages \ <PkgGUID> \AutomationEvents]
« AutomationProjectEvents " = " retourne l'objet d'AutomationProjectEvents »
« AutomationProjectItemEvents " = " retourne l'objet d'AutomationProjectItemsEvents »
Nom |
Type |
Plage |
Description |
---|---|---|---|
valeur par défaut (@) |
REG_SZ |
Non utilisé |
Non utilisé. Vous pouvez utiliser le champ de données à la documentation. |
AutomationProjectsEvents |
REG_SZ |
nom de votre objet événement. |
Seul le nom de la clé est approprié. Vous pouvez utiliser le champ de données à la documentation. Cet exemple provient de l'exemple de base de projet. |
AutomationProjectItemEvents |
REG_SZ |
nom de votre objet événement |
Seul le nom de la clé est approprié. Vous pouvez utiliser le champ de données à la documentation. Cet exemple provient de l'exemple de base de projet. |
Lorsque chacun de vos objets événement est demandé par un consommateur d'automation, créez un objet racine qui a des méthodes pour un événement que votre VSPackage prend en charge. l'environnement appelle la méthode appropriée d' get_ sur cet objet. par exemple, si DTE.Events.AutomationProjectsEvents est appelé, l'objet de méthode d' get_AutomationProjectsEvents à la racine est appelé.
Modèle Automation pour les événements
La classe CProjectEventsContainer représente l'objet source pour BscProjectsEvents, tandis que CProjectItemsEventsContainer représente l'objet source pour BscProjectItemsEvents.
Dans la plupart des cas, vous devez retourner un objet pour chaque demande d'événement car la plupart des objets événement prennent un objet de filtre. Lorsque vous déclenchez votre événement, vérifiez 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 dans le tableau suivant.
Classe |
Description |
---|---|
CAutomationEvents |
implémente un objet racine d'événement, extrait de l'objet d' DTE.Events . |
CProjectsEventsContainer et CProjectItemsEventsContainer |
Implémentez les objets de source d'événement qui déclenchent des événements correspondants. |
l'exemple de code suivant montre comment répondre à une demande d'un objet é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 événements d'éléments de projet qui sont générés de votre implémentation d'un VSPackage.
Les objets événement sont extraits du même emplacement central, l'objet d' DTE.Events . De cette façon, tous les objets événement sont rassemblées afin qu'un utilisateur final n'ait pas à parcourir le modèle objet entier pour rechercher un événement spécifique. Cela vous permet également de fournir vos objets spécifiques d'un VSPackage, au lieu de vous obliger à implémenter votre propre code pour les événements au niveau de le système. Toutefois, pour l'utilisateur final, qui doit rechercher un événement pour votre interface d' ProjectItem , il n'est pas immédiatement connu d'où cet objet événement est récupéré.