显示项目对象

Visual Studio 提供 Vspackage 可以扩展到无缝使 Visual Studio 自动化模型的动态环境。 这些新对象来扩展自动化模型 DTE 对象。

DTE 对象是 Visual Studio 自动化模型的主要目的。 它在 Visual Studio 自动化对象层次结构顶层内。

VSPackage 特定对象的名称存储在注册表中,因此,创建并返回对象的代码是您的 VSPackage 实现的一部分。 下面的过程描述如何找到 VSPackage 特定对象。

  1. Visual Studio 集成开发 (IDE)环境启动。

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

  3. 自动化使用者调用 GetObject 方法或 IDispatch::GetIDsOfNames,并传递对象的名称,如下所示:

    DTE.GetObject("VCProjects")
    
  4. IDE 在表中查找字符串参数并加载相应的 VSPackage。

  5. IDE 调用 GetAutomationObject 方法使用一个名称 (例如 “调用”传递的 VCProjects。

  6. VSPackage 创建并返回对象的 IDispatch 指针。 如果对象已存在,则其引用计数递增。 在此示例中,调用方将指针传递给标准 Projects 集合对象,一个实现由 Visual C++。

  7. 返回的对象是用于查看其他入口点项目的自动化对象。

在获得特定 Projects 对象后,请使用 Item 方法获取对应于 Visual C++ 项目的 Project 对象。 在获得标准 Project 对象后,调用 Object 对象获取对特定于项目的对象。 Object 对象是您返回使用您的唯一方法和属性,扩展 Project 对象的位置。 您甚至可以创建并返回其他对象。

要显示自动化对象的名称存储为字符串值的名称在以下注册表项下的:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 8.0 \ packages \ \ <PkgGUID> 自动化]

备注

该文本 <PkgGUID> 表示您的 VSPackage 实际 GUID。

下面的代码示例和表包含典型的注册表项。

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 8.0 \ packages \ \ <PkgGUID> 自动化]

@= ""

“FigProjects " = " 正在项目自动化对象”

名称升级过程中或新数据库需要 -ra 参数

类型

范围

说明

默认 (@)

REG_SZ

null

未使用。 可以为文档使用此。

FigProjects

REG_SZ

您的单个项目集合对象的名称。

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

所有 sharepoint 项目服务提供的新项目类型应提供自动化对象。 例如, Visual C++ 创建外接程序可通过 DTE.VCProjectsDTE.GetObject的 VSPackage 给定对象 (“VCProjects”) 获取然后调用 Visual C++ 项目对象。 Projects 集合。 Projects 及其包含的 Project 项目是 Visual C++ 实现,但符合标准模式。 但是,使用者获取对 Project.Object,为项目类型都是唯一的,并且可以提供自己的唯一对象。 项目自动化模型还可以 Project.CodeModel,可以为泛首选派生的对象 (VCCodeModel) 的查询。

相同的 ProjectItem,还图面 ProjectItem.ObjectFileCodeModel转到。

Visual C++ VSPackage 然后创建为传递的对象返回自动化使用者。

提供项目中的一些特定对象

  1. 添加合适的项到您的 VSPackage 注册表设置。

  2. 实现在返回 IDispatch 对象 IVsPackage 接口的 GetAutomationObject 的代码。

    下面的代码示例演示 GetAutomationObject 方法的实现。

    Private Function GetAutomationObject(ByVal pszPropName As LPCOLESTR, ByVal ppIDispatch As IDispatch**) As STDMETHODIMP Implements CVsPackage.GetAutomationObject 
        ExpectedPtrRet(ppIDispatch) 
        *ppIDispatch = NULL 
    
        If _wcsicmp(pszPropName, g_wszAutomationProjects) = 0 Then 
           'Is the requested name our Projects object? 
           ' Gets our Projects object 
           Return GetAutomationProjects(ppIDispatch) 
        ElseIf _wcsicmp(pszPropName, g_wszAutomationProjectsEvents) = 0 Then 
            'Is the requested name our ProjectsEvents object? 
            ' Gets our ProjectEvents object 
            Return CAutomationEvents.GetAutomationEvents(ppIDispatch) 
        ElseIf _wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) = 0 Then 
            'Is the requested name our ProjectsItemsEvents object? 
            ' Gets our ProjectItemsEvents object 
            Return CAutomationEvents.GetAutomationEvents(ppIDispatch) 
        End If 
        Return E_INVALIDARG 
    End Function 
    
    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,则该字符串签入 <PkgGUID> \ 自动化项下 (如注册表项所示)。 如下面的代码示例所示, GetAutomationProjects 方法创建对象 Projects 实现接口并返回 IDispatch 指针调用的对象,。

    Private Function GetAutomationProjects(ByVal ppIDispatch As IDispatch**) As HRESULT Implements CVsPackage.GetAutomationProjects 
        ExpectedPtrRet(ppIDispatch) 
        *ppIDispatch = NULL 
    
        If Not m_srpAutomationProjects Then 
            Dim hr As HRESULT = CACProjects.CreateInstance(AddressOf m_srpAutomationProjects) 
            IfFailRet(hr) 
            ExpectedExprRet(m_srpAutomationProjects <> NULL) 
        End If 
        Return m_srpAutomationProjects.CopyTo(ppIDispatch) 
    End Function
    
    HRESULT CVsPackage::GetAutomationProjects(/* [out] */ IDispatch ** ppIDispatch)
    {
        ExpectedPtrRet(ppIDispatch);
        *ppIDispatch = NULL;
    
        if (!m_srpAutomationProjects)
        {
            HRESULT hr = CACProjects::CreateInstance(&m_srpAutomationProjects);
            IfFailRet(hr);
            ExpectedExprRet(m_srpAutomationProjects != NULL);
        }
        return m_srpAutomationProjects.CopyTo(ppIDispatch);
    }
    

    您应选择唯一的名称。您的自动化对象。 名称冲突时不可预知的,因此,冲突导致一个冲突的对象名随机扔超出,如果多个 Vspackage 使用相同的名称。 为了避免这种冲突,建议您使用自动化对象的名称中包含您的公司名称或其产品名称的某个功能。

    Projects 集合对象是为项目自动化模型的其余部分入口点。 在创建提供使用者提供 Projects 集合对象的相应代码和注册表项后,您的实现必须为项目模型提供剩余的标准对象。 有关更多信息,请参见 建模项目

请参见

参考

GetAutomationObject

概念

建模项目