公开 Visual Studio SDK 的事件

使用自动化, Visual Studio可以源事件。 建议您项目和项目项的源事件。

事件由自动化使用者检索从 Events 对象或 GetObject (“EventObjectName”)。 该环境调用 IDispatch::Invoke 使用 DISPATCH_METHOD 或 DISPATCH_PROPERTYGET 标志返回事件。

以下过程说明 VSPackage 特定事件如何返回。

  1. 环境启动。

  2. 它从注册表在表中读取所有值名称在所有 Vspackage 下自动化、 AutomationEvents 和 AutomationProperties 项,然后存储这些名称。

  3. 自动化使用者在此示例中、 DTE.Events.AutomationProjectsEvents 或 DTE.Events.AutomationProjectItemsEvents调用,。

  4. 该环境在表中查找字符串参数并加载相应的 VSPackage。

  5. 该环境调用 GetAutomationObject 方法通过在调用中传递的名称;在此示例中、 AutomationProjectsEvents 或 AutomationProjectItemsEvents。

  6. VSPackage 创建具有方法例如 get_AutomationProjectsEventsget_AutomationProjectItemEvents 的根对象并返回 IDispatch 指针为对象。

  7. 该环境调用相应的方法根据该名称传递给自动调用。

  8. get_ 方法创建另一个基于 IDispatch 的事件对象实现 IConnectionPointContainer 接口和 IConnectionPoint 接口并返回 IDispatch指向对象。

使用自动化,若要显示操作,您必须对 GetAutomationObject 并记下您向注册表添加的字符串。 在基本项目示例中,字符串为 “BscProjectsEvents”和 “BscProjectItemsEvents”。

从基本项目示例的注册表项

本节中进行验证添加自动化事件值添加到注册表中。

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

“AutomationProjectEvents " = " 返回 AutomationProjectEvents 对象”

“AutomationProjectItemEvents " = " 返回 AutomationProjectItemsEvents 对象”

名称

类型

范围

说明

默认 (@)

REG_SZ

未使用

未使用。 可以为文档使用数据字段。

AutomationProjectsEvents

REG_SZ

事件对象的名称。

仅名称是相关的。 可以为文档使用数据字段。

此示例来自基本项目示例。

AutomationProjectItemEvents

REG_SZ

事件对象的名称

仅名称是相关的。 可以为文档使用数据字段。

此示例来自基本项目示例。

当任何事件对象由自动化使用者时请求,请创建具有所有事件的方法 VSPackage 支持的根对象。 该环境调用此对象的相应 get_ 方法。 例如,因此,如果 DTE.Events.AutomationProjectsEvents 调用,在根对象的 get_AutomationProjectsEvents 调用方法。

事件的自动化模型

Visual Studio 项目事件

,而 CProjectItemsEventsContainer 表示 BscProjectItemsEvents 的,源对象类 CProjectEventsContainer 表示 BscProjectsEvents 的源对象。

在大多数情况下,,因为大多数事件对象采用筛选器对象,则必须返回每个事件请求的新对象。 在触发事件时,请检查此筛选器验证事件处理程序。

AutomationEvents.h 和 AutomationEvents.cpp 下表中包含类的声明和实现。

说明

CAutomationEvents

实现事件根对象,检索从 DTE.Events 对象。

CProjectsEventsContainerCProjectItemsEventsContainer

实现引发相应的事件的事件源对象。

下面的代码示例演示如何响应对事件对象。

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

在以上代码, g_wszAutomationProjects 是项目集合 (“FigProjects”) 的名称, g_wszAutomationProjectsEvents (“FigProjectsEvents”),并 g_wszAutomationProjectItemsEvents (“FigProjectItemEvents”) 是的项目事件和项目项事件的名称从 VSPackage 实现是源。

事件对象从同一个中央位置, DTE.Events 对象检索。 ,所有事件对象进行分组这样,以便最终用户不需要浏览整个对象模型查找特定事件。 这也使您可以提供特定 VSPackage 对象,而不是需要实现系统级的事件自己的代码。 但是,对于最终用户,必须找到 ProjectItem 接口的事件,从不十分清楚该事件对象检索的位置。

请参见

参考

GetAutomationObject

概念

Visual Studio 扩展性示例