Zveřejnění objektů projektu
Vlastní typy projektů mohou poskytovat objekty automatizace, aby bylo možné povolit přístup k projektu pomocí automatizačních rozhraní. Očekává se, že každý typ projektu poskytne standardní Project automatizační objekt, ze Solutionkterého se přistupuje , který obsahuje kolekci všech projektů otevřených v integrovaném vývojovém prostředí (IDE). Očekává se, že každá položka v projektu bude vystavena objektem ProjectItem , ke Project.ProjectItems
kterým přistupuje . Kromě těchtostandardníchm objektů
Můžete vytvořit vlastní objekty automatizace na úrovni kořenového adresáře, ke kterým můžete přistupovat z kořenového objektu DTE pomocí DTE.<customObjectName>
nebo DTE.GetObject("<customObjectName>")
. Například Visual C++ vytvoří kolekci projektů specifickou pro C++ s názvem VCProjects , ke které máte přístup pomocí DTE.VCProjects
nebo DTE.GetObject("VCProjects")
. Můžete také vytvořit Project.Object
objekt , který je jedinečný pro typ projektu, a Project.CodeModel
, který lze dotazovat na jeho nejvíce odvozený objekt, a , ProjectItem
který zveřejňuje ProjectItem.Object
a ProjectItem.FileCodeModel
a .
Jedná se o běžnou konvenci pro projekty, které zpřístupňují vlastní kolekci projektů specifickou pro projekt. Například Visual C++ vytvoří konkrétní kolekci projektů jazyka C++, ke které pak můžete přistupovat pomocí DTE.VCProjects
nebo DTE.GetObject("VCProjects")
. Můžete také vytvořit Project.Object
objekt , který je jedinečný pro typ projektu, který Project.CodeModel
lze dotazovat na jeho nejvýraznější objekt, a ProjectItem
, který zveřejňuje ProjectItem.Object
, a ProjectItem.FileCodeModel
.
Přispívání objektu specifického pro balíček VSPackage pro projekt
Přidejte příslušné klíče do souboru .pkgdef balíčku VSPackage.
Tady jsou například nastavení .pkgdef pro projekt jazyka C++:
[$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation] "VCProjects"="" [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents] "VCProjectEngineEventsObject"=""
Implementujte kód v GetAutomationObject metodě, jako v následujícím příkladu.
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; }
V kódu
g_wszAutomationProjects
je název kolekce projektů. MetodaGetAutomationProjects
vytvoří objekt, který implementujeProjects
rozhraní a vrátíIDispatch
ukazatel na volající objekt, jak je znázorněno v následujícím příkladu kódu.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); }
Zvolte jedinečný název objektu automatizace. Konflikty názvů jsou nepředvídatelné a kolize způsobí, že konfliktní název objektu bude libovolně vyvolán, pokud stejný název používá více typů projektů. Do názvu objektu automatizace byste měli zahrnout název společnosti nebo nějaký jedinečný aspekt jejího názvu produktu.
Objekt vlastní
Projects
kolekce je vstupním bodem pro zbývající část modelu automatizace projektu. Objekt projektu je také přístupný z Solution kolekce projektů. Po vytvoření odpovídajících položek kódu a registru, které uživatelůmProjects
poskytují objekty kolekce, musí implementace poskytnout zbývající standardní objekty pro model projektu. Další informace najdete v tématu Modelování projektů.