Condividi tramite


Esporre gli oggetti di project

Visual Studio fornisce un ambiente dinamico in cui Vspackage può essere esteso senza problemi contribuire al modello di automazione di Visual Studio. Questi nuovi oggetti estendono l'oggetto di DTE del modello di automazione di.

L'oggetto di DTE è l'oggetto principale del modello di automazione di Visual Studio. Si trova nella parte superiore della gerarchia di oggetti di automazione di Visual Studio .

I nomi degli oggetti VSPackage-specifici vengono archiviati nel Registro di sistema e il codice che crea e restituisce l'oggetto fanno parte dell' implementazione di un VSPackage. La procedura seguente viene descritto come gli oggetti VSPackage-specifici si trovano.

  1. L'avvio dell' ambiente di (IDE) sviluppo integrato di Visual Studio.

  2. Legge dal Registro di sistema tutti i nomi del valore nelle chiavi di automazione, di AutomationEvents e di AutomationProperties di qualsiasi Vspackage e archivia questi nomi in una tabella.

  3. Un utente di automazione chiama il metodo o IDispatch::GetIDsOfNamesdi GetObject e passa il nome di un oggetto, come illustrato di seguito:

    DTE.GetObject("VCProjects")
    
  4. L'ide trova il parametro di stringa nella tabella e carica il package VS corrispondente.

  5. L'ide chiama il metodo di GetAutomationObject utilizzando un nome come “VCProjects„ passato nella chiamata.

  6. Il package VS crea e restituisce il puntatore di IDispatch dell' oggetto. Se l'oggetto esiste già, il conteggio dei riferimenti viene incrementato. In questo esempio, il chiamante passato a un puntatore a un oggetto Collection standard di Projects , quello implementato da Visual C++.

  7. L'oggetto restituito è il punto di ingresso per verificare che il resto gli oggetti di automazione di un progetto.

Una volta ottenuto un oggetto specifico di Projects , utilizzare il metodo di Item per ottenere un oggetto di Project che corrisponde a un progetto Visual C++. Una volta ottenuto un oggetto standard di Project , chiamare l'oggetto di Object per accedere a un oggetto specifico del progetto. L'oggetto di Object viene utilizzato per restituire un oggetto che estende l'oggetto di Project utilizzando i metodi e le proprietà univoci. È inoltre possibile creare e restituire altri oggetti.

I nomi degli oggetti di automazione che si desidera esporre vengono memorizzati come nomi dei valori stringa in seguente chiave del Registro di sistema:

[HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\Automation]

Nota

Il <pkgguid> di testo rappresenta effettivo GUID del pacchetto VS.

Il seguente esempio di codice e tabella contengono le voci del Registro di sistema tipiche.

[HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\Automation]

@= ""

“FigProjects " = " figure proiettano l'oggetto ActiveX„

Nome

Type

Intervallo

Descrizione

Il valore predefinito (@)

REG_SZ

null

Non utilizzato. È possibile utilizzare questo per la documentazione.

FigProjects

REG_SZ

Nome dell' oggetto della raccolta di progetti univoco.

Solo il nome della chiave è rilevante. È possibile utilizzare il campo dati per la documentazione.

Il package VS che forniscono i nuovi tipi di progetto deve fornire gli oggetti di automazione. Ad esempio, Visual C++ crea oggetti VSPackage-specifici che i componenti aggiuntivi possono chiamare con DTE.VCProjects o DTE.GetObject(“VCProjects„) per ottenere gli oggetti del progetto di Visual C++ tramite la raccolta di Projects . Projects e i relativi elementi contenuti di Project sono l'implementazione di Visual C++ ma seguono il modello standard. Tuttavia, l'utente può accedere a Project.Object, che sono univoci per il tipo di progetto e può fornire i propri oggetti univoco possibile. Un modello di automazione del progetto può essere Project.CodeModel, che è possibile eseguire una query per un oggetto maggiormente derivato (VCCodeModel).

Lo stesso evento per ProjectItem, anch'essa sorga ProjectItem.Objecte FileCodeModel.

Visual C++ VSPackage quindi crea gli oggetti passare di nuovo all' utente di automazione.

Per consentire un oggetto VSPackage-specifico per un progetto

  1. Aggiungere chiavi adatte alle impostazioni del Registro di sistema del package VS.

  2. Implementare il codice in GetAutomationObject dell' interfaccia di IVsPackage che restituisce un oggetto di IDispatch .

    Nell'esempio di codice riportato di seguito viene illustrata un'implementazione del metodo 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;
    }
    

    In il codice, g_wszAutomationProjects è il nome della raccolta di progetti. In questo esempio, si è “FigProjects,„ la stringa registrata nella chiave di <PkgGUID>\Automation (come illustrato nelle voci del Registro di sistema). Il metodo di GetAutomationProjects crea un oggetto che implementa l'interfaccia di Projects e restituisce un puntatore di IDispatch l'oggetto chiamante, come illustrato nell' esempio di codice.

    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);
    }
    

    È necessario scegliere un nome univoco per l'oggetto ActiveX. I conflitti di nomi sono imprevedibili e i conflitti provocano un nome di oggetto in conflitto per essere generati in modo arbitrario off se più utilizzo di package VS che gli stessi nome. Per evitare questi conflitti, è consigliabile includere la denominazione sociale o un determinato aspetto univoco del nome del prodotto nel nome dell' oggetto ActiveX.

    L'oggetto Collection di Projects è il punto di ingresso per la parte restante del modello di automazione del progetto. Dopo avere creato il codice e le voci del Registro di sistema appropriati che forniscono agli utenti con gli oggetti Collection di Projects , l'implementazione di deve fornire oggetti standard rimanenti per il modello di progetto. Per ulteriori informazioni, vedere Modellazione di progetto.

Vedere anche

Riferimenti

GetAutomationObject

Concetti

Modellazione di progetto