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.
Środowisko jest uruchamiane.
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.
W tym przykładzie
DTE.Events.AutomationProjectsEvents
wywołania użytkownika automatyzacji lubDTE.Events.AutomationProjectItemsEvents
.Środowisko znajduje parametr ciągu w tabeli i ładuje odpowiedni pakiet VSPackage.
Środowisko wywołuje metodę GetAutomationObject przy użyciu nazwy przekazanej w wywołaniu ; w tym przykładzie
AutomationProjectsEvents
lubAutomationProjectItemsEvents
.Pakiet VSPackage tworzy obiekt główny, który zawiera metody, takie jak
get_AutomationProjectsEvents
iget_AutomationProjectItemEvents
, a następnie zwraca wskaźnik IDispatch do obiektu.Środowisko wywołuje odpowiednią metodę na podstawie nazwy przekazanej do wywołania automatyzacji.
Metoda
get_
tworzy inny obiekt zdarzeń oparty na protokole IDispatch, który implementuje zarównoIConnectionPointContainer
interfejs, jakIConnectionPoint
i interfejs, i zwraca obiektIDispatchpointer
.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.
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.