Compartir a través de


Exposición de eventos en el SDK de Visual Studio

Visual Studio le permite obtener eventos de origen mediante la automatización. Se recomienda que cree eventos de origen para proyectos y elementos de proyecto.

Los consumidores de automatización recuperan los eventos del objeto Events o GetObject (por ejemplo, GetObject("EventObjectName")). El entorno llama a IDispatch::Invoke mediante las marcas DISPATCH_METHOD o DISPATCH_PROPERTYGET para devolver un evento.

En el proceso siguiente se explica cómo se devuelven los eventos específicos de un VSPackage.

  1. El entorno se inicia.

  2. Lee del registro todos los nombres de valor en las claves Automation, AutomationEvents y AutomationProperties de todos los VSPackages y almacena esos nombres en una tabla.

  3. Un consumidor de automatización llama, en este ejemplo, a DTE.Events.AutomationProjectsEvents o DTE.Events.AutomationProjectItemsEvents.

  4. El entorno busca el parámetro de cadena en la tabla y carga el VSPackage correspondiente.

  5. El entorno llama al método GetAutomationObject mediante el nombre pasado en la llamada; en este ejemplo, AutomationProjectsEvents o AutomationProjectItemsEvents.

  6. VSPackage crea un objeto raíz que tiene métodos como get_AutomationProjectsEvents y get_AutomationProjectItemEvents y, a continuación, devuelve un puntero IDispatch al objeto .

  7. El entorno llama al método adecuado en función del nombre pasado a la llamada de automatización.

  8. El método get_ crea otro objeto de evento basado en IDispatch que implementa la interfaz IConnectionPointContainer y la interfaz IConnectionPoint y devuelve un objeto IDispatchpointer al objeto.

    Para exponer un evento mediante la automatización, debe responder a GetAutomationObject e inspeccionar las cadenas que agregue al registro. En el ejemplo de proyecto básico, las cadenas son BscProjectsEvents y BscProjectItemsEvents.

Entradas del registro del ejemplo de proyecto básico

En esta sección se muestra dónde agregar valores de evento de automatización al registro.

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

AutomationProjectEvents = Devuelve el objeto AutomationProjectEvents.

AutomationProjectItemEvents = Devuelve el objeto AutomationProjectItemsEvents.

Nombre Tipo Intervalo Descripción
Valor predeterminado (@) REG_SZ No utilizado Sin usar. Puede usar el campo de datos para la documentación.
AutomationProjectsEvents REG_SZ Nombre del objeto de evento. Solo el nombre de clave es relevante. Puede usar el campo de datos para la documentación.

Este ejemplo procede del ejemplo de proyecto básico.
AutomationProjectItemEvents REG_SZ Nombre del objeto de evento Solo el nombre de clave es relevante. Puede usar el campo de datos para la documentación.

Este ejemplo procede del ejemplo de proyecto básico.

Cuando un consumidor de automatización solicita cualquiera de los objetos de evento, cree un objeto raíz que tenga métodos para cualquier evento que admita VSPackages. El entorno llama al método get_ adecuado en este objeto. Por ejemplo, si se llama a DTE.Events.AutomationProjectsEvents, se invoca el método get_AutomationProjectsEvents en el objeto raíz.

Eventos de proyecto de Visual Studio

Modelo de automatización para eventos

La clase CProjectEventsContainer representa el objeto de origen para BscProjectsEvents y CProjectItemsEventsContainer representa el objeto de origen de BscProjectItemsEvents.

En la mayoría de los casos, debe devolver un nuevo objeto para cada solicitud de evento porque la mayoría de los objetos de evento toman un objeto de filtro. Al activar el evento, compruebe este filtro para verificar que se llama al controlador de eventos.

AutomationEvents.h y AutomationEvents.cpp contienen declaraciones e implementaciones de las clases de la siguiente tabla.

Clase Descripción
CAutomationEvents Implementa un objeto raíz del evento, recuperado del objeto DTE.Events.
CProjectsEventsContainer y CProjectItemsEventsContainer Implemente los objetos de origen del evento que activan los eventos correspondientes.

En el ejemplo de código siguiente se muestra cómo responder a una solicitud de un objeto de 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;
}

En el código anterior, g_wszAutomationProjects es el nombre de la colección de proyectos (FigProjects), g_wszAutomationProjectsEvents (FigProjectsEvents) y g_wszAutomationProjectItemsEvents (FigProjectItemEvents) son los nombres de los eventos de proyecto y los eventos de elementos de proyecto que se obtienen de la implementación de VSPackage.

Los objetos de evento se recuperan de la misma ubicación central, el objeto DTE.Events. De este modo, todos los objetos de evento se agrupan para que un usuario final no tenga que examinar todo el modelo de objetos para encontrar un evento específico. Esto también le permite proporcionar sus objetos de VSPackage específicos, en lugar de requerir que implemente su propio código para eventos en todo el sistema. Sin embargo, para el usuario final, que debe encontrar un evento para la interfaz ProjectItem, no se borra inmediatamente de dónde se recupera ese objeto de evento.