Exposer des objets de projet

Les types de projets personnalisés peuvent fournir des objets d’automatisation afin d’autoriser l’accès au projet à l’aide d’interfaces d’automatisation. Chaque type de projet est censé fournir l’objet Automation standard Project accessible à partir duquel Solutionil contient une collection de tous les projets ouverts dans l’IDE. Chaque élément du projet doit être exposé par un ProjectItem objet accessible avec Project.ProjectItems. En plus de ces objets d’automatisation standard, les projets peuvent choisir d’offrir des objets d’automatisation spécifiques au projet.

Vous pouvez créer des objets d’automatisation de niveau racine personnalisés auxquels vous pouvez accéder en retard à partir de l’objet DTE racine à l’aide DTE.<customObjectName> ou DTE.GetObject("<customObjectName>"). Par exemple, Visual C++ crée une collection de projets spécifique à un projet C++ appelée VCProjects que vous pouvez accéder à l’aide DTE.VCProjects ou DTE.GetObject("VCProjects"). Vous pouvez également créer un Project.Object, qui est unique pour le type de projet, un Project.CodeModel, qui peut être interrogé pour son objet le plus dérivé, et un ProjectItem, qui expose ProjectItem.Object et a ProjectItem.FileCodeModel.

Il s’agit d’une convention commune pour que les projets exposent une collection de projets personnalisée et spécifique à un projet. Par exemple, Visual C++ crée une collection de projets spécifique C++ que vous pouvez ensuite accéder à l’aide DTE.VCProjects ou DTE.GetObject("VCProjects"). Vous pouvez également créer un Project.Object, qui est unique pour le type de projet, un Project.CodeModel, qui peut être interrogé pour son objet le plus dérivé, un ProjectItem, qui expose ProjectItem.Object, et a ProjectItem.FileCodeModel.

Pour contribuer à un objet spécifique à VSPackage pour un projet

  1. Ajoutez les clés appropriées au fichier .pkgdef de votre VSPackage.

    Par exemple, voici les paramètres .pkgdef du projet de langage C++ :

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

    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 correspond au nom de votre collection de projets. La GetAutomationProjects méthode crée un objet qui implémente l’interface Projects et retourne un IDispatch pointeur vers l’objet appelant, comme illustré dans l’exemple de code suivant.

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

    Choisissez un nom unique pour votre objet Automation. Les conflits de noms sont imprévisibles et les collisions provoquent un nom d’objet en conflit arbitrairement levée si plusieurs types de projet utilisent le même nom. Vous devez inclure votre nom d’entreprise ou un aspect unique de son nom de produit dans le nom de l’objet Automation.

    L’objet de collection personnalisé Projects est un point d’entrée pratique pour la partie restante de votre modèle d’automatisation de projet. Votre objet projet est également accessible à partir de la collection de Solution projets. Une fois que vous avez créé le code et les entrées de Registre appropriées qui fournissent aux consommateurs des Projects objets de collection, votre implémentation doit fournir des objets standard restants pour le modèle de projet. Pour plus d’informations, consultez modélisation de projet.