公开项目对象

自定义项目类型可以提供自动化对象,以便允许使用自动化接口访问项目。 每个项目类型应提供从中Solution访问的标准Project自动化对象,该对象包含 IDE 中打开的所有项目的集合。 项目中的每一 ProjectItem 项应由访问对象 Project.ProjectItems公开。 除了这些标准自动化对象,项目还可以选择提供特定于项目的自动化对象。

可以创建自定义根级自动化对象,这些对象可以使用或DTE.GetObject("<customObjectName>")从根 DTE 对象DTE.<customObjectName>访问后期绑定。 例如,Visual C++ 创建一个名为 VCProjects 的 C++ 项目特定的项目集合,可以使用或DTE.GetObject("VCProjects")访问DTE.VCProjects。 还可以为项目类型创建一个唯一Project.ObjectProject.CodeModel的项目类型、可查询其最派生对象的属性,以及ProjectItem公开ProjectItem.Object和公开的对象ProjectItem.FileCodeModel

项目公开自定义项目特定项目集合是一种常见约定。 例如,Visual C++ 创建一个 C++ 特定的项目集合,然后可以使用或DTE.GetObject("VCProjects")访问DTE.VCProjects该集合。 还可以创建一个项目类型的唯一Project.ObjectProject.CodeModel对象、可查询其最派生对象、ProjectItem公开ProjectItem.Object的对象和一个ProjectItem.FileCodeModel

为项目提供特定于 VSPackage 的对象

  1. 将相应的密钥添加到 VSPackage 的 .pkgdef 文件中。

    例如,下面是 C++ 语言项目的 .pkgdef 设置:

    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation]
    "VCProjects"=""
    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents]
    "VCProjectEngineEventsObject"=""
    
  2. GetAutomationObject 方法中实现代码,如以下示例所示。

    STDMETHODIMP CVsPackage::GetAutomationObject(
    /* [in]  */ LPCOLESTR       pszPropName,
    /* [out] */ IDispatch **    ppIDispatch)
    {
    ExpectedPtrRet(pszPropName);
    ExpectedPtrRet(ppIDispatch);
    *ppIDispatch = NULL;
    
        if (m_fZombie)
            return E_UNEXPECTED;
    
        if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0)
        {
            return GetAutomationProjects(ppIDispatch);
        }
        else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0)
        {
            return CAutomationEvents::GetAutomationEvents(ppIDispatch);
        }
        else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0)
        {
            return CAutomationEvents::GetAutomationEvents(ppIDispatch);
        }
        return E_INVALIDARG;
    }
    

    在代码中, g_wszAutomationProjects 是项目集合的名称。 该方法 GetAutomationProjects 创建一个实现 Projects 接口的对象,并返回指向 IDispatch 调用对象的指针,如下面的代码示例所示。

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

    为自动化对象选择唯一名称。 名称冲突不可预知,如果多个项目类型使用相同的名称,冲突会导致任意抛出冲突的对象名称。 应在自动化对象的名称中包含公司名称或其产品名称的一些唯一方面。

    自定义 Projects 集合对象是项目自动化模型的剩余部分的便利入口点。 还可以从 Solution 项目集合访问项目对象。 创建为使用者 Projects 提供集合对象的相应代码和注册表项后,实现必须为项目模型提供剩余的标准对象。 有关详细信息,请参阅 Project 建模