Share via


Esporre eventi in Visual Studio SDK

Visual Studio consente di generare eventi usando l'automazione. È consigliabile creare eventi di origine per progetti ed elementi del progetto.

Gli eventi vengono recuperati dai consumer di automazione dall'oggetto Events o GetObject (ad esempio, GetObject("EventObjectName")). L'ambiente chiama IDispatch::Invoke utilizzando i DISPATCH_METHOD flag o DISPATCH_PROPERTYGET per restituire un evento.

Il processo seguente illustra come vengono restituiti eventi specifici di VSPackage.

  1. Viene avviato l'ambiente.

  2. Legge dal Registro di sistema tutti i nomi di valore nelle chiavi Automation, AutomationEvents e AutomationProperties di tutti i pacchetti VSPackage e archivia tali nomi in una tabella.

  3. Un consumer di automazione chiama, in questo esempio o DTE.Events.AutomationProjectsEventsDTE.Events.AutomationProjectItemsEvents.

  4. L'ambiente trova il parametro stringa nella tabella e carica il VSPackage corrispondente.

  5. L'ambiente chiama il GetAutomationObject metodo usando il nome passato nella chiamata; in questo esempio o AutomationProjectsEventsAutomationProjectItemsEvents.

  6. VsPackage crea un oggetto radice con metodi quali get_AutomationProjectsEvents e get_AutomationProjectItemEvents quindi restituisce un puntatore IDispatch all'oggetto.

  7. L'ambiente chiama il metodo appropriato in base al nome passato alla chiamata di automazione.

  8. Il get_ metodo crea un altro oggetto evento basato su IDispatch che implementa sia l'interfaccia IConnectionPointContainer che l'interfaccia IConnectionPoint e restituisce un oggetto IDispatchpointer all'oggetto .

    Per esporre un evento usando l'automazione, è necessario rispondere GetAutomationObject e controllare le stringhe aggiunte al Registro di sistema. Nell'esempio Progetto di base le stringhe sono BscProjectsEvents e BscProjectItemsEvents.

Voci del Registro di sistema dell'esempio di progetto di base

In questa sezione viene illustrato dove aggiungere i valori degli eventi di automazione al Registro di sistema.

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

AutomationProjectEvents = Restituisce l'oggetto AutomationProjectEvents .

AutomationProjectItemEvents = Restituisce l'oggetto AutomationProjectItemsEvents .

Nome Type Intervallo Descrizione
Impostazione predefinita (@) REG_SZ Non utilizzato Non utilizzato. È possibile usare il campo dati per la documentazione.
AutomationProjectsEvents REG_SZ Nome dell'oggetto evento. Solo il nome della chiave è rilevante. È possibile usare il campo dati per la documentazione.

Questo esempio proviene dall'esempio Di progetto di base.
AutomationProjectItemEvents REG_SZ Nome dell'oggetto evento Solo il nome della chiave è rilevante. È possibile usare il campo dati per la documentazione.

Questo esempio proviene dall'esempio Di progetto di base.

Quando uno degli oggetti evento viene richiesto da un consumer di automazione, creare un oggetto radice con metodi per qualsiasi evento supportato dal pacchetto VSPackage. L'ambiente chiama il metodo appropriato get_ su questo oggetto. Ad esempio, se DTE.Events.AutomationProjectsEvents viene chiamato , viene richiamato il get_AutomationProjectsEvents metodo sull'oggetto radice.

Visual Studio project events Modello di automazione per gli eventi

La classe CProjectEventsContainer rappresenta l'oggetto di origine per BscProjectsEvents e CProjectItemsEventsContainer rappresenta l'oggetto di origine per BscProjectItemsEvents.

Nella maggior parte dei casi, è necessario restituire un nuovo oggetto per ogni richiesta di evento perché la maggior parte degli oggetti evento accetta un oggetto filtro. Quando si attiva l'evento, controllare questo filtro per verificare che venga chiamato il gestore eventi.

AutomationEvents.h e AutomationEvents.cpp contengono dichiarazioni e implementazioni delle classi nella tabella seguente.

Classe Descrizione
CAutomationEvents Implementa un oggetto radice dell'evento, recuperato dall'oggetto DTE.Events .
CProjectsEventsContainer e CProjectItemsEventsContainer Implementare gli oggetti origine evento che generano gli eventi corrispondenti.

Nell'esempio di codice seguente viene illustrato come rispondere a una richiesta di un oggetto evento.

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

Nel codice precedente è g_wszAutomationProjects il nome della raccolta di progetti (FigProjects), g_wszAutomationProjectsEvents (FigProjectsEvents) e g_wszAutomationProjectItemsEvents (FigProjectItemEvents) sono i nomi degli eventi del progetto e degli eventi degli elementi del progetto originati dall'implementazione di VSPackage.

Gli oggetti evento vengono recuperati dalla stessa posizione centrale, ovvero dall'oggetto DTE.Events . In questo modo, tutti gli oggetti evento vengono raggruppati in modo che un utente finale non deve esplorare l'intero modello a oggetti per trovare un evento specifico. In questo modo è anche possibile fornire oggetti VSPackage specifici, invece di richiedere l'implementazione del codice personalizzato per gli eventi a livello di sistema. Tuttavia, per l'utente finale, che deve trovare un evento per l'interfaccia ProjectItem , non è immediatamente chiaro da dove viene recuperato l'oggetto evento.