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.
Viene avviato l'ambiente.
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.
Un consumer di automazione chiama, in questo esempio o
DTE.Events.AutomationProjectsEvents
DTE.Events.AutomationProjectItemsEvents
.L'ambiente trova il parametro stringa nella tabella e carica il VSPackage corrispondente.
L'ambiente chiama il GetAutomationObject metodo usando il nome passato nella chiamata; in questo esempio o
AutomationProjectsEvents
AutomationProjectItemsEvents
.VsPackage crea un oggetto radice con metodi quali
get_AutomationProjectsEvents
eget_AutomationProjectItemEvents
quindi restituisce un puntatore IDispatch all'oggetto.L'ambiente chiama il metodo appropriato in base al nome passato alla chiamata di automazione.
Il
get_
metodo crea un altro oggetto evento basato su IDispatch che implementa sia l'interfacciaIConnectionPointContainer
che l'interfacciaIConnectionPoint
e restituisce un oggettoIDispatchpointer
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.
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.