Представление событий в Visual Studio SDK
Visual Studio позволяет события источника с помощью автоматизации. Рекомендуется события источника для проектов и элементов проектов.
События получаются из объектами-получателями автоматизации Events объект или GetObject EventObjectName (""). Вызовы среды IDispatch::Invoke с помощью DISPATCH_METHOD OR DISPATCH_PROPERTYGET флаги для возвращения событие.
Следующий процесс объясняет, как события VSPackage-специфического возвращаются.
Запуске среды.
Он считывает данные из реестра все имена, значения ниже ключами автоматизации, AutomationEvents и AutomationProperties всего VSPackages, и сохраняет эти имена в таблице.
Объект-получатель вызывает автоматизации в этом примере DTE.Events.AutomationProjectsEvents OR DTE.Events.AutomationProjectItemsEvents.
Среда находит параметр строк в таблице и загружает соответствующие VSPackage.
Среда вызывает GetAutomationObject метод с помощью загруженного имени в вызове. в этом примере AutomationProjectsEvents или AutomationProjectItemsEvents.
VSPackage создает корневой объект, который содержит методы как get_AutomationProjectsEvents и get_AutomationProjectItemEvents затем возвращает указатель IDispatch на объекте.
Среда вызывает соответствующий метод основано на имени, переданного в вызов, автоматизации.
get_ метод создает другой IDispatch-основанный объект события, который реализует оба IConnectionPointContainer интерфейс и IConnectionPoint интерфейс и возвращает IDispatchуказатель на объект.
Для предоставления событие с помощью автоматизации необходимо ответить на GetAutomationObject и контрольные значения для строк, которые добавляются в реестр. В собственном образце проекта "BscProjectsEvents" и "BscProjectItemsEvents".
Записи реестра из основной образца проекта
В этом подразделе показано место для добавления значений событий автоматизации в реестр.
[HKEY_LOCAL_MACHINE \ software \ microsoft \ VisualStudio \ 8,0 \ packages \<PkgGUID>\ AutomationEvents]
"AutomationProjectEvents" = " возвращает объект AutomationProjectEvents"
"AutomationProjectItemEvents" = " возвращает объект AutomationProjectItemsEvents"
Имя |
Тип |
Диапазон |
Описание |
---|---|---|---|
Значение по умолчанию (@) |
REG_SZ |
Не используется |
Не используется. Можно использовать поле данных для документации. |
AutomationProjectsEvents |
REG_SZ |
Имя объекта события. |
Является значимым только имя ключа. Можно использовать поле данных для документации. В этом примере берется из базового образца проекта. |
AutomationProjectItemEvents |
REG_SZ |
Имя объекта события |
Является значимым только имя ключа. Можно использовать поле данных для документации. В этом примере берется из базового образца проекта. |
Если любой из объектов событий, запрашиваемый объектом-получателем автоматизации, создайте корневой объект, содержащий методы для любого события, в VSPackage поддерживает. Среда вызывает соответствующее get_ метод в данном объекте. Например, если DTE.Events.AutomationProjectsEvents вызывает get_AutomationProjectsEvents метод вызывается на объекте корня.
Модель автоматизации для событий
Класс CProjectEventsContainer представляет исходный объект для BscProjectsEvents, пока CProjectItemsEventsContainer представляет исходный объект для BscProjectItemsEvents.
В большинстве случаев следует возвратить новый объект для каждого запроса события, поскольку большинство объектов событий принимают объект фильтра. При горите пользовательское событие, установите фильтр, чтобы убедиться, что обработчик событий вызывается.
AutomationEvents.h и AutomationEvents.cpp содержащих объявления и реализации классов в следующей таблице.
Класс |
Описание |
---|---|
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 интерфейс, немедленно неясно, откуда этот объект события.