Sdílet prostřednictvím


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.

  1. Spustí se prostředí.

  2. 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.

  3. Volání příjemce automatizace v tomto příkladu DTE.Events.AutomationProjectsEvents nebo DTE.Events.AutomationProjectItemsEvents.

  4. Prostředí najde v tabulce parametr řetězce a načte odpovídající balíček VSPackage.

  5. Prostředí volá metodu GetAutomationObject pomocí názvu předaného ve volání, v tomto příkladu AutomationProjectsEvents nebo AutomationProjectItemsEvents.

  6. VSPackage vytvoří kořenový objekt, který obsahuje metody, jako get_AutomationProjectsEvents get_AutomationProjectItemEvents je a poté vrátí ukazatel IDispatch na objekt.

  7. Prostředí volá příslušnou metodu na základě názvu předaného do volání automatizace.

  8. Metoda get_ vytvoří další objekt událostí založený na IDispatch, který implementuje rozhraní IConnectionPointContainer i IConnectionPoint 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.

Události projektu sady Visual Studio

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.