Zveřejnění událostí v sadě Visual Studio SDK
Visual Studio umožňuje vytvářet události pomocí automatizace. Doporučujeme zdrojové události pro projekty a položky projektu.
Události se načítají příjemci automatizace z objektu Events nebo GetObject (například GetObject("EventObjectName")
). Volání IDispatch::Invoke
prostředí pomocí DISPATCH_METHOD
příznaků DISPATCH_PROPERTYGET
pro vrácení události.
Následující proces vysvětluje, jak se vrací události specifické pro VSPackage.
Spustí se prostředí.
Načte z registru všechny názvy hodnot pod klíči Automation, AutomationEvents a AutomationProperties všech balíčků VSPackage a uloží tyto názvy do tabulky.
Volání příjemce automatizace v tomto příkladu
DTE.Events.AutomationProjectsEvents
neboDTE.Events.AutomationProjectItemsEvents
.Prostředí najde v tabulce parametr řetězce a načte odpovídající balíček VSPackage.
Prostředí volá metodu GetAutomationObject pomocí názvu předaného ve volání, v tomto příkladu
AutomationProjectsEvents
neboAutomationProjectItemsEvents
.VSPackage vytvoří kořenový objekt, který obsahuje metody, jako
get_AutomationProjectsEvents
get_AutomationProjectItemEvents
je a poté vrátí ukazatel IDispatch na objekt.Prostředí volá příslušnou metodu na základě názvu předaného do volání automatizace.
Metoda
get_
vytvoří další objekt událostí založený na IDispatch, který implementuje rozhraníIConnectionPointContainer
iIConnectionPoint
rozhraní a vrátíIDispatchpointer
objektu.Pokud chcete událost zveřejnit pomocí automatizace, musíte reagovat GetAutomationObject na řetězce, které přidáte do registru, a sledovat je. V ukázce základního projektu jsou řetězce BscProjectsEvents a BscProjectItemsEvents.
Položky registru z ukázky základního projektu
Tato část ukazuje, kde přidat hodnoty událostí automatizace do registru.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]
AutomationProjectEvents = Vrátí AutomationProjectEvents
objekt.
AutomationProjectItemEvents = Vrátí AutomationProjectItemsEvents
objekt.
Name | Type | Rozsah | Popis |
---|---|---|---|
Výchozí (@) | REG_SZ | Nepoužitý | Nepoužívá se. Datové pole můžete použít pro dokumentaci. |
AutomationProjectsEvents | REG_SZ | Název objektu události | Relevantní je jenom název klíče. Datové pole můžete použít pro dokumentaci. Tento příklad pochází z ukázky základního projektu. |
AutomationProjectItemEvents | REG_SZ | Název objektu události | Relevantní je jenom název klíče. Datové pole můžete použít pro dokumentaci. Tento příklad pochází z ukázky základního projektu. |
Pokud je některý z objektů událostí požadován příjemcem automatizace, vytvořte kořenový objekt, který má metody pro jakoukoli událost, kterou váš balíček VSPackage podporuje. Prostředí volá příslušnou get_
metodu pro tento objekt. Pokud je například DTE.Events.AutomationProjectsEvents
volána, get_AutomationProjectsEvents
metoda v kořenovém objektu je vyvolána.
Model automatizace pro události
Třída CProjectEventsContainer
představuje zdrojový objekt pro BscProjectsEvents a CProjectItemsEventsContainer
představuje zdrojový objekt pro BscProjectItemsEvents.
Ve většině případů musíte vrátit nový objekt pro každý požadavek na událost, protože většina objektů událostí převezme objekt filtru. Když událost aktivujete, zkontrolujte tento filtr a ověřte, že se volá obslužná rutina události.
AutomationEvents.h a AutomationEvents.cpp obsahují deklarace a implementace tříd v následující tabulce.
Třída | Popis |
---|---|
CAutomationEvents |
Implementuje kořenový objekt události načtený z objektu DTE.Events . |
CProjectsEventsContainer a CProjectItemsEventsContainer |
Implementujte zdrojové objekty události, které aktivují odpovídající události. |
Následující příklad kódu ukazuje, jak reagovat na požadavek na objekt události.
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;
}
Ve výše uvedeném g_wszAutomationProjects
kódu je název kolekce projektů (FigProjects), g_wszAutomationProjectsEvents
(FigProjectsEvents) a g_wszAutomationProjectItemsEvents
(FigProjectItemEvents) názvy událostí projektu a událostí položek projektu, které pocházejí z vaší implementace VSPackage.
Objekty událostí se načítají ze stejného centrálního umístění, objektu DTE.Events
. Tímto způsobem jsou všechny objekty událostí seskupené tak, aby koncový uživatel nemusel procházet celý objektový model, aby našel konkrétní událost. Díky tomu můžete také poskytnout konkrétní objekty VSPackage, místo abyste museli implementovat vlastní kód pro systémové události. Pro koncového uživatele, který musí najít událost pro vaše ProjectItem
rozhraní, však není okamžitě jasné, odkud se objekt události načte.