Esporre oggetti progetto
I tipi di progetto personalizzati possono fornire oggetti di automazione per consentire l'accesso al progetto tramite interfacce di automazione. Ogni tipo di progetto deve fornire l'oggetto di automazione standard Project a cui si accede da Solution, che contiene una raccolta di tutti i progetti aperti nell'IDE. Ogni elemento del progetto deve essere esposto da un ProjectItem oggetto a cui si accede con Project.ProjectItems
. Oltre a questi oggetti di automazione standard, i progetti possono scegliere di offrire oggetti di automazione specifici del progetto.
È possibile creare oggetti di automazione a livello radice personalizzati a cui è possibile accedere in ritardo dall'oggetto DTE radice usando DTE.<customObjectName>
o DTE.GetObject("<customObjectName>")
. Ad esempio, Visual C++ crea una raccolta di progetti specifica del progetto C++ denominata VCProjects a cui è possibile accedere usando DTE.VCProjects
o DTE.GetObject("VCProjects")
. È anche possibile creare un Project.Object
oggetto , che è univoco per il tipo di progetto, un Project.CodeModel
oggetto che può essere sottoposto a query per il relativo oggetto più derivato e un ProjectItem
oggetto , che espone ProjectItem.Object
e un ProjectItem.FileCodeModel
oggetto .
È una convenzione comune per i progetti per esporre una raccolta di progetti personalizzata specifica del progetto. Ad esempio, Visual C++ crea una raccolta di progetti specifica di C++ a cui è possibile accedere usando DTE.VCProjects
o DTE.GetObject("VCProjects")
. È anche possibile creare un Project.Object
oggetto , che è univoco per il tipo di progetto, un Project.CodeModel
oggetto che può essere sottoposto a query per il relativo oggetto più derivato, un ProjectItem
oggetto , che espone ProjectItem.Object
e .ProjectItem.FileCodeModel
Per contribuire a un oggetto specifico di VSPackage per un progetto
Aggiungere le chiavi appropriate al file con estensione pkgdef del pacchetto VSPackage.
Ecco ad esempio le impostazioni pkgdef per il progetto di linguaggio C++:
[$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation] "VCProjects"="" [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents] "VCProjectEngineEventsObject"=""
Implementare il codice nel GetAutomationObject metodo , come nell'esempio seguente.
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; }
Nel codice è
g_wszAutomationProjects
il nome della raccolta di progetti. IlGetAutomationProjects
metodo crea un oggetto che implementa l'interfacciaProjects
e restituisce unIDispatch
puntatore all'oggetto chiamante, come illustrato nell'esempio di codice seguente.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); }
Scegliere un nome univoco per l'oggetto di automazione. I conflitti di nomi sono imprevedibili e le collisioni causano la creazione arbitraria di un nome oggetto in conflitto se più tipi di progetto usano lo stesso nome. È necessario includere il nome dell'azienda o un aspetto univoco del nome del prodotto nel nome dell'oggetto di automazione.
L'oggetto raccolta personalizzato
Projects
è un punto di ingresso pratico per la parte rimanente del modello di automazione del progetto. L'oggetto progetto è accessibile anche dalla raccolta di Solution progetti. Dopo aver creato il codice e le voci del Registro di sistema appropriati che forniscono agli utentiProjects
oggetti raccolta, l'implementazione deve fornire gli oggetti standard rimanenti per il modello di progetto. Per altre informazioni, vedere Modellazione di progetti.