Verfügbarmachen von Ereignissen im Visual Studio SDK
Mit Visual Studio können Sie Ereignisse mithilfe der Automation erstellen. Es wird empfohlen, Ereignisse für Projekte und Projektelemente zu erstellen.
Ereignisse werden von Automatisierungsanwendern aus dem Events Objekt oder GetObject (z. B GetObject("EventObjectName")
. ) abgerufen. Die Umgebung ruft IDispatch::Invoke
mit Hilfe der Flags DISPATCH_METHOD
oder DISPATCH_PROPERTYGET
zum Zurückgeben eines Ereignisses auf.
Im folgenden Prozess wird erläutert, wie VSPackage-spezifische Ereignisse zurückgegeben werden.
Umgebung starten
Sie liest aus der Registrierung alle Wertnamen unter den Schlüsseln Automation, AutomationEvents und AutomationProperties aller VSPackages und speichert diese Namen in einer Tabelle.
Ein Automatisierungsanwender ruft in diesem Beispiel
DTE.Events.AutomationProjectsEvents
oderDTE.Events.AutomationProjectItemsEvents
auf.Die Umgebung findet den String-Parameter in der Tabelle und lädt das entsprechende VSPackage.
Die Umgebung ruft die GetAutomationObject Methode mithilfe des im Aufruf übergebenen Namens auf; in diesem Beispiel
AutomationProjectsEvents
oderAutomationProjectItemsEvents
.Das VSPackage erstellt ein Stammobjekt mit Methoden wie
get_AutomationProjectsEvents
undget_AutomationProjectItemEvents
gibt dann einen IDispatch-Zeiger auf das Objekt zurück.Die Umgebung ruft die entsprechende Methode basierend auf dem Namen auf, der an den Automationsaufruf übergeben wird.
Die
get_
Methode erstellt ein weiteres IDispatch-basiertes Ereignisobjekt, das sowohl dieIConnectionPointContainer
Schnittstelle als auch dieIConnectionPoint
Schnittstelle implementiert und einIDispatchpointer
an das Objekt zurückgibt.Um ein Ereignis mithilfe der Automation verfügbar zu machen, müssen Sie auf GetAutomationObject reagieren und auf die Zeichenketten achten, die Sie der Registrierung hinzufügen. Im Basisprojekt-Beispiel sind die Zeichenketten BscProjectsEvents und BscProjectItemsEvents.
Registrierungseinträge aus dem Basisprojekt-Beispiel
In diesem Abschnitt wird gezeigt, wo Sie der Registrierung Automation-Ereigniswerte hinzufügen.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]
AutomationProjectEvents = Gibt das AutomationProjectEvents
Objekt zurück.
AutomationProjectItemEvents = Gibt das AutomationProjectItemsEvents
Objekt zurück.
Name | type | Range | Beschreibung |
---|---|---|---|
Standard (@) | REG_SZ | Nicht verwendet | Nicht verwendet. Sie können das Datenfeld für die Dokumentation verwenden. |
AutomationProjectsEvents | REG_SZ | Name des Ereignisobjekts. | Nur der Schlüsselname ist relevant. Sie können das Datenfeld für die Dokumentation verwenden. Dieses Beispiel stammt aus dem Basisprojekt-Beispiel. |
AutomationProjectItemEvents | REG_SZ | Name Ihres Ereignisobjekts | Nur der Schlüsselname ist relevant. Sie können das Datenfeld für die Dokumentation verwenden. Dieses Beispiel stammt aus dem Basisprojekt-Beispiel. |
Wenn eines Ihrer Ereignisobjekte von einem Automation-Anwender angefordert wird, erstellen Sie ein Stammobjekt mit Methoden für jedes Ereignis, das von Ihrem VSPackage unterstützt wird. Die Umgebung ruft die entsprechende get_
Methode für dieses Objekt auf. Wenn beispielsweise DTE.Events.AutomationProjectsEvents
aufgerufen wird, wird die get_AutomationProjectsEvents
Methode für das Stammobjekt aufgerufen.
Automationsmodell für Ereignisse
Die Klasse CProjectEventsContainer
stellt das Quellobjekt für BscProjectsEvents dar und CProjectItemsEventsContainer
stellt das Quellobjekt für BscProjectItemsEvents dar.
In den meisten Fällen müssen Sie ein neues Objekt für jede Ereignisanforderung zurückgeben, da die meisten Ereignisobjekte ein Filterobjekt verwenden. Wenn Sie Ihr Ereignis auslösen, überprüfen Sie diesen Filter, um sicherzustellen, dass der Ereignishandler aufgerufen wird.
AutomationEvents.h und AutomationEvents.cpp enthalten Deklarationen und Implementierungen der Klassen in der folgenden Tabelle.
Klasse | Beschreibung |
---|---|
CAutomationEvents |
Implementiert ein Ereignis-Stammobjekt, das aus dem DTE.Events Objekt abgerufen wird. |
CProjectsEventsContainer und CProjectItemsEventsContainer |
Implementieren Sie die Ereignis-Quellobjekte, die die entsprechenden Ereignisse auslösen. |
Das folgende Codebeispiel zeigt, wie sie auf eine Anforderung für ein Ereignisobjekt reagieren.
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;
}
Im obigen Code ist g_wszAutomationProjects
der Name Ihrer Projektsammlung (FigProjects), g_wszAutomationProjectsEvents
(FigProjectsEvents) und g_wszAutomationProjectItemsEvents
(FigProjectItemEvents) die Namen von Projektereignissen und Projektelementereignissen, die aus ihrer VSPackage-Implementierung stammen.
Ereignisobjekte werden von derselben zentralen Position abgerufen, dem DTE.Events
Objekt. Auf diese Weise werden alle Ereignisobjekte gruppiert, sodass ein Endbenutzer nicht das gesamte Objektmodell durchsuchen muss, um ein bestimmtes Ereignis zu finden. Auf diese Weise können Sie auch bestimmte VSPackage-Objekte bereitstellen, anstatt ihren eigenen Code für systemweite Ereignisse zu implementieren. Für den Endbenutzer, der ein Ereignis für Ihre ProjectItem
Schnittstelle finden muss, ist es jedoch nicht sofort klar, wo dieses Ereignisobjekt abgerufen wird.