Поделиться через


Предоставление объектов проекта

Пользовательские типы проектов могут предоставлять объекты автоматизации, чтобы разрешить доступ к проекту с помощью интерфейсов автоматизации. Ожидается, что каждый тип проекта предоставляет стандартный Project объект автоматизации, к которому осуществляется доступ Solution, который содержит коллекцию всех проектов, открытых в интегрированной среде разработки. Ожидается, что каждый элемент проекта предоставляется объектом, ProjectItem к которым Project.ProjectItemsосуществляется доступ. Помимо этих стандартных объектов автоматизации проекты могут предлагать объекты автоматизации для конкретных проектов.

Можно создать пользовательские объекты автоматизации корневого уровня, к которым можно получить доступ из корневого объекта DTE с помощью DTE.<customObjectName> или DTE.GetObject("<customObjectName>"). Например, Visual C++ создает коллекцию проектов для конкретного проекта C++ с именем VCProjects , доступ к которым можно получить с помощью DTE.VCProjects или DTE.GetObject("VCProjects"). Можно также создать Project.Objectуникальный тип проекта, Project.CodeModelкоторый можно запросить для своего наиболее производного объекта, а также объект ProjectItem, который предоставляет ProjectItem.Object и a ProjectItem.FileCodeModel.

Это общее соглашение для проектов для предоставления настраиваемой коллекции проектов для конкретных проектов. Например, Visual C++ создает определенную коллекцию проектов C++, к которым можно получить доступ с помощью DTE.VCProjects или DTE.GetObject("VCProjects"). Можно также создать Project.Objectуникальный тип проекта, который можно запросить для своего наиболее производного объекта, Project.CodeModelProjectItemкоторый ProjectItem.Objectпредоставляет и aProjectItem.FileCodeModel.

Внесение изменений в объект VSPackage для проекта

  1. Добавьте соответствующие ключи в PKGDEF-файл VSPackage.

    Например, ниже приведены параметры PKGDEF для языкового проекта C++:

    [$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 объекты коллекции, реализация должна предоставлять оставшиеся стандартные объекты для модели проекта. Дополнительные сведения см. в разделе "Моделирование проекта".