Share via


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.Objectoggetto , che è univoco per il tipo di progetto, un Project.CodeModeloggetto che può essere sottoposto a query per il relativo oggetto più derivato e un ProjectItemoggetto , che espone ProjectItem.Object e un ProjectItem.FileCodeModeloggetto .

È 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.Objectoggetto , che è univoco per il tipo di progetto, un Project.CodeModeloggetto che può essere sottoposto a query per il relativo oggetto più derivato, un ProjectItemoggetto , che espone ProjectItem.Objecte .ProjectItem.FileCodeModel

Per contribuire a un oggetto specifico di VSPackage per un progetto

  1. 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"=""
    
  2. 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. Il GetAutomationProjects metodo crea un oggetto che implementa l'interfaccia Projects e restituisce un IDispatch 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 utenti Projects oggetti raccolta, l'implementazione deve fornire gli oggetti standard rimanenti per il modello di progetto. Per altre informazioni, vedere Modellazione di progetti.