Freigeben über


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.

  1. Umgebung starten

  2. Sie liest aus der Registrierung alle Wertnamen unter den Schlüsseln Automation, AutomationEvents und AutomationProperties aller VSPackages und speichert diese Namen in einer Tabelle.

  3. Ein Automatisierungsanwender ruft in diesem Beispiel DTE.Events.AutomationProjectsEvents oder DTE.Events.AutomationProjectItemsEventsauf.

  4. Die Umgebung findet den String-Parameter in der Tabelle und lädt das entsprechende VSPackage.

  5. Die Umgebung ruft die GetAutomationObject Methode mithilfe des im Aufruf übergebenen Namens auf; in diesem Beispiel AutomationProjectsEvents oder AutomationProjectItemsEvents.

  6. Das VSPackage erstellt ein Stammobjekt mit Methoden wie get_AutomationProjectsEvents und get_AutomationProjectItemEvents gibt dann einen IDispatch-Zeiger auf das Objekt zurück.

  7. Die Umgebung ruft die entsprechende Methode basierend auf dem Namen auf, der an den Automationsaufruf übergeben wird.

  8. Die get_ Methode erstellt ein weiteres IDispatch-basiertes Ereignisobjekt, das sowohl die IConnectionPointContainer Schnittstelle als auch die IConnectionPoint Schnittstelle implementiert und ein IDispatchpointer 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.

Visual Studio Projektereignisse

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.