Udostępnij za pośrednictwem


Uwidacznianie zdarzeń w zestawie Visual Studio SDK

Program Visual Studio umożliwia źródło zdarzeń przy użyciu automatyzacji. Zalecamy źródło zdarzeń dla projektów i elementów projektu.

Zdarzenia są pobierane przez użytkowników automatyzacji z Events obiektu lub GetObject (na przykład GetObject("EventObjectName")). Środowisko wywołuje IDispatch::Invoke przy użyciu DISPATCH_METHOD flag lub DISPATCH_PROPERTYGET w celu zwrócenia zdarzenia.

W poniższym procesie wyjaśniono, jak są zwracane zdarzenia specyficzne dla pakietu VSPackage.

  1. Środowisko jest uruchamiane.

  2. Odczytuje ona z rejestru wszystkie nazwy wartości w ramach kluczy Automation, AutomationEvents i AutomationProperties wszystkich pakietów VSPackage oraz przechowuje te nazwy w tabeli.

  3. W tym przykładzie DTE.Events.AutomationProjectsEvents wywołania użytkownika automatyzacji lub DTE.Events.AutomationProjectItemsEvents.

  4. Środowisko znajduje parametr ciągu w tabeli i ładuje odpowiedni pakiet VSPackage.

  5. Środowisko wywołuje metodę GetAutomationObject przy użyciu nazwy przekazanej w wywołaniu ; w tym przykładzie AutomationProjectsEvents lub AutomationProjectItemsEvents.

  6. Pakiet VSPackage tworzy obiekt główny, który zawiera metody, takie jak get_AutomationProjectsEvents i get_AutomationProjectItemEvents , a następnie zwraca wskaźnik IDispatch do obiektu.

  7. Środowisko wywołuje odpowiednią metodę na podstawie nazwy przekazanej do wywołania automatyzacji.

  8. Metoda get_ tworzy inny obiekt zdarzeń oparty na protokole IDispatch, który implementuje zarówno IConnectionPointContainer interfejs, jak IConnectionPoint i interfejs, i zwraca obiekt IDispatchpointer .

    Aby uwidocznić zdarzenie przy użyciu automatyzacji, należy odpowiedzieć na GetAutomationObject ciągi dodawane do rejestru i obserwować je. W przykładzie Basic Project ciągi to BscProjectsEvents i BscProjectItemsEvents.

Wpisy rejestru z przykładu podstawowego projektu

W tej sekcji pokazano, gdzie dodać wartości zdarzeń automatyzacji do rejestru.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]

AutomationProjectEvents = Zwraca AutomationProjectEvents obiekt.

AutomationProjectItemEvents = Zwraca AutomationProjectItemsEvents obiekt.

Nazwisko Typ Zakres opis
Wartość domyślna (@) REG_SZ Nieużywane Nieużywany. Możesz użyć pola danych do dokumentacji.
AutomationProjectsEvents REG_SZ Nazwa obiektu zdarzenia. Tylko nazwa klucza jest odpowiednia. Możesz użyć pola danych do dokumentacji.

Ten przykład pochodzi z przykładu Podstawowego projektu.
AutomationProjectItemEvents REG_SZ Nazwa obiektu zdarzenia Tylko nazwa klucza jest odpowiednia. Możesz użyć pola danych do dokumentacji.

Ten przykład pochodzi z przykładu Podstawowego projektu.

Gdy dowolny obiekt zdarzenia jest żądany przez użytkownika automatyzacji, utwórz obiekt główny, który zawiera metody dla dowolnego zdarzenia obsługiwanego przez pakiet VSPackage. Środowisko wywołuje odpowiednią get_ metodę dla tego obiektu. Jeśli na przykład DTE.Events.AutomationProjectsEvents jest wywoływana, wywoływana get_AutomationProjectsEvents jest metoda w obiekcie głównym.

Zdarzenia projektu programu Visual Studio

Model automatyzacji dla zdarzeń

Klasa CProjectEventsContainer reprezentuje obiekt źródłowy BscProjectsEvents i CProjectItemsEventsContainer reprezentuje obiekt źródłowy BscProjectItemsEvents.

W większości przypadków należy zwrócić nowy obiekt dla każdego żądania zdarzenia, ponieważ większość obiektów zdarzeń bierze obiekt filtru. Po uruchomieniu zdarzenia sprawdź ten filtr, aby sprawdzić, czy program obsługi zdarzeń jest wywoływany.

AutomationEvents.h i AutomationEvents.cpp zawierają deklaracje i implementacje klas w poniższej tabeli.

Klasa opis
CAutomationEvents Implementuje obiekt główny zdarzenia pobrany z DTE.Events obiektu .
CProjectsEventsContainer i CProjectItemsEventsContainer Zaimplementuj obiekty źródła zdarzeń, które uruchamiają odpowiednie zdarzenia.

Poniższy przykładowy kod pokazuje, jak odpowiedzieć na żądanie dla obiektu zdarzenia.

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;
}

W powyższym g_wszAutomationProjects kodzie jest nazwą kolekcji projektu (FigProjects), g_wszAutomationProjectsEvents (FigProjectsEvents) i g_wszAutomationProjectItemsEvents (FigProjectItemEvents) są nazwami zdarzeń projektu i zdarzeń elementów projektu, które pochodzą z implementacji pakietu VSPackage.

Obiekty zdarzeń są pobierane z tej samej centralnej lokalizacji, DTE.Events obiektu . Dzięki temu wszystkie obiekty zdarzeń są grupowane razem, aby użytkownik końcowy nie musiał przeglądać całego modelu obiektów w celu znalezienia określonego zdarzenia. Dzięki temu można również podać określone obiekty pakietu VSPackage, zamiast wymagać zaimplementowania własnego kodu dla zdarzeń obejmujących cały system. Jednak dla użytkownika końcowego, który musi znaleźć zdarzenie dla interfejsu ProjectItem , nie jest od razu jasne, gdzie jest pobierany ten obiekt zdarzenia.