Поделиться через


Предоставление событий в пакете SDK Для Visual Studio

Visual Studio позволяет выполнять исходные события с помощью автоматизации. Рекомендуется создавать исходные события для проектов и элементов проекта.

События извлекаются потребителями автоматизации из Events объекта или GetObject (например, GetObject("EventObjectName")). Среда вызывается IDispatch::Invoke с помощью DISPATCH_METHOD или DISPATCH_PROPERTYGET флагов для возврата события.

В следующем процессе объясняется, как возвращаются события, относящиеся к VSPackage.

  1. Начинается среда.

  2. Он считывает из реестра все имена значений в разделах Automation, AutomationEvents и AutomationProperties всех VSPackages и сохраняет эти имена в таблице.

  3. В этом примере DTE.Events.AutomationProjectsEvents или DTE.Events.AutomationProjectItemsEventsвызовы потребителя автоматизации.

  4. Среда находит строковый параметр в таблице и загружает соответствующий VSPackage.

  5. Среда вызывает GetAutomationObject метод с помощью имени, переданного в вызове; в этом примере AutomationProjectsEvents или AutomationProjectItemsEvents.

  6. VSPackage создает корневой объект, имеющий такие методы, как get_AutomationProjectsEvents и get_AutomationProjectItemEvents затем возвращает указатель IDispatch на объект.

  7. Среда вызывает соответствующий метод на основе имени, переданного в вызов автоматизации.

  8. Метод 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 , вызывается метод корневого объекта.

События проекта Visual Studio

Модель автоматизации для событий

Класс 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 интерфейса, не сразу ясно, откуда извлекается этот объект события.