Предоставление объектов проекта
Пользовательские типы проектов могут предоставлять объекты автоматизации, чтобы разрешить доступ к проекту с помощью интерфейсов автоматизации. Ожидается, что каждый тип проекта предоставляет стандартный 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.CodeModel
ProjectItem
который ProjectItem.Object
предоставляет и aProjectItem.FileCodeModel
.
Внесение изменений в объект VSPackage для проекта
Добавьте соответствующие ключи в PKGDEF-файл VSPackage.
Например, ниже приведены параметры PKGDEF для языкового проекта C++:
[$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation] "VCProjects"="" [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents] "VCProjectEngineEventsObject"=""
Реализуйте код в методе 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
объекты коллекции, реализация должна предоставлять оставшиеся стандартные объекты для модели проекта. Дополнительные сведения см. в разделе "Моделирование проекта".