使用自动化, Visual Studio可以源事件。 建议您项目和项目项的源事件。
事件由自动化使用者检索从 Events 对象或 GetObject (“EventObjectName”)。 该环境调用 IDispatch::Invoke 使用 DISPATCH_METHOD 或 DISPATCH_PROPERTYGET 标志返回事件。
以下过程说明 VSPackage 特定事件如何返回。
环境启动。
它从注册表在表中读取所有值名称在所有 Vspackage 下自动化、 AutomationEvents 和 AutomationProperties 项,然后存储这些名称。
自动化使用者在此示例中、 DTE.Events.AutomationProjectsEvents 或 DTE.Events.AutomationProjectItemsEvents调用,。
该环境在表中查找字符串参数并加载相应的 VSPackage。
该环境调用 GetAutomationObject 方法通过在调用中传递的名称;在此示例中、 AutomationProjectsEvents 或 AutomationProjectItemsEvents。
VSPackage 创建具有方法例如 get_AutomationProjectsEvents 和 get_AutomationProjectItemEvents 的根对象并返回 IDispatch 指针为对象。
该环境调用相应的方法根据该名称传递给自动调用。
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 调用方法。
事件的自动化模型
,而 CProjectItemsEventsContainer 表示 BscProjectItemsEvents 的,源对象类 CProjectEventsContainer 表示 BscProjectsEvents 的源对象。
在大多数情况下,,因为大多数事件对象采用筛选器对象,则必须返回每个事件请求的新对象。 在触发事件时,请检查此筛选器验证事件处理程序。
AutomationEvents.h 和 AutomationEvents.cpp 下表中包含类的声明和实现。
类 |
说明 |
---|---|
CAutomationEvents |
实现事件根对象,检索从 DTE.Events 对象。 |
CProjectsEventsContainer 和 CProjectItemsEventsContainer |
实现引发相应的事件的事件源对象。 |
下面的代码示例演示如何响应对事件对象。
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 接口的事件,从不十分清楚该事件对象检索的位置。