Exposer des objets du projetExposing Project Objects

Les types de projet personnalisés peuvent fournir des objets automation afin d’autoriser l’accès au projet à l’aide des interfaces automation.Custom project types can provide automation objects in order to allow access to the project using automation interfaces. Chaque type de projet est censé fournir la norme Project accessible à partir de l’objet automation Solution, qui contient une collection de tous les projets ouverts dans l’IDE.Every project type is expected to provide the standard Project automation object that is accessed from Solution, which contains a collection of all projects that are open in the IDE. Chaque élément dans le projet est censé être exposé par un ProjectItem objet accédé avec Project.ProjectItems.Each item in the project is expected to be exposed by a ProjectItem object accessed with Project.ProjectItems. En plus de ces objets automation standard, projets peuvent choisir d’offrir des objets spécifiques au projet automation.In addition to these standard automation objects, projects can choose to offer project-specific automation objects.

Vous pouvez créer personnalisées au niveau racine objets automation auquel vous pouvez accéder à liaison tardive à partir de l’objet DTE racine à l’aide DTE.<customeObjectName> ou DTE.GetObject("<customObjectName>").You can create custom root-level automation objects that you can access late-bound from the root DTE object using DTE.<customeObjectName> or DTE.GetObject("<customObjectName>"). Par exemple, Visual C++ crée la collection de projet spécifique à un projet C++ appelée « VCProjects », vous pouvez accéder à l’aide de DTE. VCProjects ou DTE. Par exemple, DTE.For example, Visual C++ creates C++ project-specific project collection called "VCProjects" that you can access using DTE.VCProjects or DTE.GetObject("VCProjects"). Vous pouvez également créer un Project.Object, qui est unique pour le type de projet, Project.CodeModel, ce qui peut être interrogé pour son objet ProjectItem, laquelle expose ProjectItem.Object et un ProjectItem.FileCodeModel plus dérivé.You can also create a Project.Object, which is unique for the project type, a Project.CodeModel, which can be queried for its most-derived object, a ProjectItem, which exposes ProjectItem.Object and a ProjectItem.FileCodeModel.

Il s’agit d’une convention commune pour les projets exposer une collection de projets personnalisés, spécifique au projet.It is a common convention for projects to expose a custom, project-specific project collection. Par exemple, Visual C++Visual C++ crée une collection de projets spécifiques de C++ que vous pouvez ensuite accéder à l’aide de DTE.VCProjects ou DTE.GetObject("VCProjects").For example, Visual C++Visual C++ creates a C++ specific project collection that you can then access using DTE.VCProjects or DTE.GetObject("VCProjects"). Vous pouvez également créer un Project.Object, qui est unique pour le type de projet, un Project.CodeModel, qui peuvent être interrogé pour son objet le plus dérivé, un ProjectItem, qui expose ProjectItem.Objectet un ProjectItem.FileCodeModel.You can also create a Project.Object, which is unique for the project type, a Project.CodeModel, which can be queried for its most-derived object, a ProjectItem, which exposes ProjectItem.Object, and a ProjectItem.FileCodeModel.

Contribuer d’un objet de VSPackage spécifique pour un projetTo contribute a VSPackage-specific object for a project

  1. Ajoutez les clés appropriées dans le fichier .pkgdef de votre VSPackage.Add the appropriate keys to the .pkgdef file of your VSPackage.

    Par exemple, voici les paramètres .pkgdef pour le projet de langage C++ :For example, here are the .pkgdef settings for the C++ language project:

    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation]  
    "VCProjects"=""  
    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents]  
    "VCProjectEngineEventsObject"=""  
    
  2. Implémenter le code dans la GetAutomationObject méthode, comme dans l’exemple suivant.Implement the code in the GetAutomationObject method, as in the following example.

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

    Dans le code, g_wszAutomationProjects est le nom de votre collection de projets.In the code, g_wszAutomationProjects is the name of your project collection. Le GetAutomationProjects méthode crée un objet qui implémente le Projects interface et retourne un IDispatch pointeur vers l’objet appelant, comme illustré dans l’exemple de code suivant.The GetAutomationProjects method creates an object that implements the Projects interface and returns an IDispatch pointer to the calling object, as shown in the following code example.

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

    Vous devez choisir un nom unique pour votre objet automation.You should choose a unique name for your automation object. Conflits de noms sont imprévisibles et provoquent des collisions un nom d’objet en conflit être arbitrairement exclues si plusieurs types de projets utilisent le même nom.Name conflicts are unpredictable, and collisions cause a conflicting object name to be arbitrarily thrown out if multiple project types use the same name. Vous devez inclure le nom de votre société ou un aspect unique de son nom de produit dans le nom de l’objet automation.You should include your corporate name or some unique aspect of its product name in the name of the automation object.

    Personnalisé Projects objet de collection est un point d’entrée de commodité pour la partie restante de votre modèle automation de projet.The custom Projects collection object is a convenience entry point for the remaining part of your project automation model. Objet de votre projet est également accessible à partir de la Solution collection de projets.Your project object is also accessible from the Solution project collection. Après avoir créé les entrées appropriées de code et de Registre qui fournissent aux consommateurs avec Projects objets de collection, votre implémentation doit fournir restant objets standard pour le modèle de projet.After you have created the appropriate code and registry entries that provide consumers with Projects collection objects, your implementation must provide remaining standard objects for the project model. Pour plus d’informations, consultez projet de modélisation.For more information, see Project Modeling.

Voir aussiSee Also

GetAutomationObject