Представление объектов проекта
Visual Studio предоставляет динамическую среду, в которой VSPackages может быть расширен, чтобы легко участвуют в модели автоматизации Visual Studio. Эти новые объекты, расширяющие объект DTE модели автоматизации.
Объект DTE главный объект модели автоматизации Visual Studio. Он находится в иерархии объектов автоматизации Visual Studio.
Имена объектов VSPackage-специфического хранятся в реестре и код, который создает и возвращает объект является частью реализации VSPackage. Следующий процесс описывает, как объекты VSPackage-специфического найдены.
Visual Studio запуске интегрированной среды разработки (ide).
Он считывает данные из реестра все имена, значения ниже ключами автоматизации, AutomationEvents и AutomationProperties всего VSPackages, и сохраняет эти имена в таблице.
Объект-получатель вызывает метод или IDispatch::GetIDsOfNames автоматизации GetObject и передает имя объекта, как показано ниже:
DTE.GetObject("VCProjects")
Интегрированная среда разработки ищет параметр строк в таблице и загружает соответствующие VSPackage.
Интегрированная среда разработки вызывает метод GetAutomationObject, используя имя, например «, передаваемое VCProjects» в вызове.
VSPackage создает и возвращает указатель IDispatch объекта. Если объект уже существует, то его значение счетчика ссылок увеличивается. В этом примере вызывающий объект передается обратно указатель к стандартному объекту коллекции Projects, по одному, реализованному Visual C++.
Объект, который возвращается точка входа для внешнего вида остальные объекты автоматизации проектов.
После того как получить указанный объект Projects, используйте метод Item чтобы получить объект Project, соответствующий проект Visual C++. После того как вы получаете стандартный объект Project, вызовите объект Object для доступа к объекту проектов. Объект Object, в которой возвращается объект, который расширяет объект Project с помощью собственных однозначно методов и свойств. Можно даже создать и вернуть другие объекты.
Имена объектов автоматизации требуется предоставить хранятся как имена строковых значений в следующем разделе реестра:
[HKEY_LOCAL_MACHINE \ software \ Microsoft \ VisualStudio \ 8,0 \ packages \<PkgGUID>\ автоматизация]
Примечание
Текст <PkgGUID> представляющая GUID самого проекта VSPackage.
В следующем примере кода и таблицы содержат стандартные записи реестра.
[HKEY_LOCAL_MACHINE \ software \ Microsoft \ VisualStudio \ 8,0 \ packages \<PkgGUID>\ автоматизация]
"" @=
«FigProjects» = " диаграмма объекта автоматизации проекта»
Имя |
Тип |
Диапазон |
Описание |
---|---|---|---|
Значение по умолчанию (@) |
REG_SZ |
null |
Не используется. Это можно использовать для документации. |
FigProjects |
REG_SZ |
Имя однозначно объекта коллекции проектов. |
Является значимым только имя ключа. Можно использовать поле данных для документации. |
Все VSPackages, которые обеспечивают новые типы проектов должно предоставлять объекты автоматизации. Например, Visual C++ создает объекты, которые VSPackage-специфического надстройки могут затем вызвать метод через DTE.VCProjects или DTE.GetObject VCProjects («») для получения объектов проекта Visual C++ по коллекции Projects. Projects и его, которые содержат элементы Project реализация Visual C++ но следовать стандартному шаблону. Однако объект-получатель может обращаться к Project.Object, который является уникальным для типа проекта, а также может предоставлять свои собственные уникальные объекты. Модель автоматизации проектов может также иметь Project.CodeModel, можно запросить дополнительные всего-выведенного объекта (VCCodeModel).
Это же становится для ProjectItem рабочей области, в которой также ProjectItem.Object и FileCodeModel.
Visual C++ VSPackage затем создает объекты для передачи обратно в объект-получатель автоматизации.
Способствовать объект VSPackage-специфического проекта
Добавьте соответствующие ключи на параметры реестра в VSPackage.
Реализуйте код в GetAutomationObject интерфейса IVsPackage, который возвращает объект IDispatch.
В следующем примере кода показана реализация метода 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); }
Необходимо указать уникальное имя объекта автоматизации. Конфликты имен становятся непредсказуемыми и конфликты приводят к вызову конфликтующие имя объекта произвольно ожидания, если использование нескольких VSPackages, то эти же именем. Чтобы избежать подобных конфликтов, рекомендуется включить ваше имя корпоративных или unique аспект его название продукта из имени объекта автоматизации.
Объект коллекции Projects точка входа для остальной части модели автоматизации проекта. После создания соответствующих записей реестра, которые позволяют кода и объекты-получателей с объектами коллекции Projects, реализация должна предоставить остальные стандартные объекты модели проекта. Дополнительные сведения см. в разделе моделирование проекта.