Предоставление событий в пакете SDK Для Visual Studio
Visual Studio позволяет выполнять исходные события с помощью автоматизации. Рекомендуется создавать исходные события для проектов и элементов проекта.
События извлекаются потребителями автоматизации из Events объекта или GetObject (например, GetObject("EventObjectName")
). Среда вызывается IDispatch::Invoke
с помощью DISPATCH_METHOD
или DISPATCH_PROPERTYGET
флагов для возврата события.
В следующем процессе объясняется, как возвращаются события, относящиеся к VSPackage.
Начинается среда.
Он считывает из реестра все имена значений в разделах Automation, AutomationEvents и AutomationProperties всех VSPackages и сохраняет эти имена в таблице.
В этом примере
DTE.Events.AutomationProjectsEvents
илиDTE.Events.AutomationProjectItemsEvents
вызовы потребителя автоматизации.Среда находит строковый параметр в таблице и загружает соответствующий VSPackage.
Среда вызывает GetAutomationObject метод с помощью имени, переданного в вызове; в этом примере
AutomationProjectsEvents
илиAutomationProjectItemsEvents
.VSPackage создает корневой объект, имеющий такие методы, как
get_AutomationProjectsEvents
иget_AutomationProjectItemEvents
затем возвращает указатель IDispatch на объект.Среда вызывает соответствующий метод на основе имени, переданного в вызов автоматизации.
Метод
get_
создает другой объект событий на основе IDispatch, который реализуетIConnectionPointContainer
интерфейс иIConnectionPoint
интерфейс и возвращаетIDispatchpointer
объект.Чтобы предоставить событие с помощью автоматизации, необходимо реагировать GetAutomationObject на строки, добавляемые в реестр, и отслеживать их. В примере базового проекта строки — BscProjectsEvents и BscProjectItemsEvents.
Записи реестра из примера "Базовый проект"
В этом разделе показано, где добавлять значения событий автоматизации в реестр.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]
AutomationProjectEvents = Возвращает AutomationProjectEvents
объект.
AutomationProjectItemEvents = Возвращает AutomationProjectItemsEvents
объект.
Имя. | Тип | Диапазон | Description |
---|---|---|---|
По умолчанию (@) | REG_SZ | Не используется | Не используется. Поле данных можно использовать для документации. |
AutomationProjectsEvents | REG_SZ | Имя объекта события. | Имеет значение только имя ключа. Поле данных можно использовать для документации. Этот пример приводится из примера "Базовый проект". |
AutomationProjectItemEvents | REG_SZ | Имя объекта события | Имеет значение только имя ключа. Поле данных можно использовать для документации. Этот пример приводится из примера "Базовый проект". |
Когда любой из объектов событий запрашивается потребителем службы автоматизации, создайте корневой объект, имеющий методы для любого события, которое поддерживает VSPackage. Среда вызывает соответствующий get_
метод для этого объекта. Например, если DTE.Events.AutomationProjectsEvents
вызывается get_AutomationProjectsEvents
, вызывается метод корневого объекта.
Модель автоматизации для событий
Класс CProjectEventsContainer
представляет исходный объект для BscProjectsEvents и CProjectItemsEventsContainer
представляет исходный объект для BscProjectItemsEvents.
В большинстве случаев необходимо вернуть новый объект для каждого запроса события, так как большинство объектов событий принимают объект фильтра. При срабатывании события проверка этот фильтр, чтобы убедиться, что вызывается обработчик событий.
AutomationEvents.h и AutomationEvents.cpp содержат объявления и реализации классов в следующей таблице.
Класс | Description |
---|---|
CAutomationEvents |
Реализует корневой объект события, полученный из DTE.Events объекта. |
CProjectsEventsContainer и CProjectItemsEventsContainer . |
Реализуйте объекты источника событий, которые запускают соответствующие события. |
В следующем примере кода показано, как реагировать на запрос объекта события.
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;
}
В приведенном выше g_wszAutomationProjects
коде — это имя коллекции проектов (FigProjects), g_wszAutomationProjectsEvents
(FigProjectsEvents) и g_wszAutomationProjectItemsEvents
(FigProjectItemEvents) — это имена событий проекта и событий элементов проекта, исходных из реализации VSPackage.
Объекты событий извлекаются из того же центрального расположения, DTE.Events
что и объект. Таким образом, все объекты событий группируются вместе, чтобы конечный пользователь не должен просматривать всю объектную модель, чтобы найти определенное событие. Это также позволяет предоставлять определенные объекты VSPackage, а не реализовывать собственный код для системных событий. Однако для конечного пользователя, который должен найти событие для вашего ProjectItem
интерфейса, не сразу ясно, откуда извлекается этот объект события.