exposer des objets Project
Visual Studio fournit un environnement dynamique où les VSPackages peut être étendu à fournir de façon transparente pour le modèle Automation Visual Studio. Ces nouveaux objets étendent l'objet d' DTE du modèle Automation.
L'objet d' DTE est l'objet principal dans le modèle Automation Visual Studio. Il se trouve placé sur la hiérarchie d'objet Automation de Visual Studio .
Les noms des objets de VSPackage-détail sont stockés dans le Registre, et le code qui crée et retourne l'objet fait partie de votre implémentation d'un VSPackage. Le processus suivant décrit comment les objets de VSPackage-détail se trouvent.
Démarrage de l'environnement de développement intégré (IDE) (IDE) de Visual Studio.
Il lit du Registre tous les noms de la valeur sous les clés d'automation, d'AutomationEvents et AutomationProperties de toutes les VSPackages, et enregistre ces noms dans un tableau.
Un consommateur d'automation appelle la méthode ou IDispatch::GetIDsOfNamesd' GetObject , et passe le nom d'un objet, comme indiqué ci-dessous :
DTE.GetObject("VCProjects")
L'IDE a trouvé le paramètre de chaîne de la table et charge le VSPackage correspondant.
L'IDE appelle la méthode d' GetAutomationObject à l'aide d'un nom tel que « VCProjects » passé dans l'appel.
Le VSPackage crée et retourne le pointeur d' IDispatch de l'objet. Si l'objet existe déjà, son décompte de références est incrémenté. Dans cet exemple, l'appelant est retournée un pointeur vers un objet de collection standard d' Projects , qui a implémenté par Visual C++.
L'objet retourné est le point d'entrée utilisé pour consulter le reste des objets Automation d'un projet.
Une fois que vous avez obtenu un objet particulier d' Projects , utilisez la méthode d' Item pour obtenir un objet d' Project qui correspond à un projet Visual C++. Une fois que vous avez obtenu un objet standard d' Project , appelez l'objet d' Object pour accéder à un objet spécifique au projet. L'objet d' Object est l'endroit où vous retournez un objet qui étend l'objet d' Project à l'aide de vos propres méthodes et propriétés. Vous pouvez même créer et retourner d'autres objets.
Les noms des objets Automation que vous souhaitez exposer sont stockés en tant que noms des valeurs de chaîne sous la clé de Registre suivante :
[HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\Automation]
Notes
Le <pkgguid> de texte représente un GUID réel de votre VSPackage.
L'exemple de code et le tableau suivants contiennent les entrées du Registre classiques.
[HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\Automation]
@= ""
« FigProjects " = " illustration l'objet Automation de projet »
Nom |
Type |
Plage |
Description |
---|---|---|---|
Valeur par défaut (@) |
REG_SZ |
null |
Non utilisé. Vous pouvez utiliser cette méthode pour la documentation. |
FigProjects |
REG_SZ |
Nom de votre objet unique collection de projets. |
Seul le nom de la clé est approprié. Vous pouvez utiliser le champ de données à la documentation. |
Tous les VSPackages qui fournissent des nouveaux types de projet doit fournir des objets Automation. Par exemple, Visual C++ crée les objets de VSPackage-détail que les compléments peut ensuite appeler à l'aide de DTE.VCProjects ou DTE.GetObject(« VCProjects ») pour obtenir les objets de projet de Visual C++ via la collection d' Projects . Projects et ses éléments contenus d' Project sont l'implémentation de Visual C++ mais suivent le modèle standard. Toutefois, il peut accéder à Project.Object, qui est unique pour le type de projet, et peut fournir ses propres objets également. Un modèle Automation de projets peut également avoir Project.CodeModel, qui peut être interrogé pour un objet le plus dérivé (VCCodeModel).
Le même emplacement pour ProjectItem, qui considère également ProjectItem.Object, et FileCodeModel.
Visual C++ VSPackage crée ensuite les objets à passer au consommateur d'automation.
Pour fournir un objet de VSPackage-détail pour un projet
Ajoutez les clés appropriées aux paramètres du Registre de votre VSPackage.
Implémentez le code dans GetAutomationObject de l'interface d' IVsPackage qui retourne un objet d' IDispatch .
L'exemple de code suivant illustre une implémentation de la méthode 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; }
Dans le code, g_wszAutomationProjects est le nom de votre collection de projets. Dans cet exemple, il est « FigProjects, » la chaîne stockée sous la clé de <PkgGUID>\Automation (comme indiqué dans les entrées du Registre). La méthode d' GetAutomationProjects crée un objet qui implémente l'interface d' Projects et retourne un pointeur d' IDispatch à l'objet appelant, comme indiqué dans l'exemple de code suivant.
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); }
Vous devez choisir un nom unique pour votre objet Automation. Les conflits de nom sont imprévisibles, et les collisions rendent un nom d'objet contradictoire arbitrairement levée si plusieurs utilisation de VSPackages que les mêmes nom. Pour éviter ces conflits, nous vous recommandons d'inclure votre dénomination sociale ou un certain seul aspect de son nom de produit dans le nom de l'objet Automation.
L'objet collection d' Projects est le point d'entrée pour la partie restante de votre modèle Automation de projet. Après avoir créé le code et les entrées du Registre appropriés qui permettent aux consommateurs d'objets de collection d' Projects , votre implémentation doit fournir des objets standard restants pour le modèle de projet. Pour plus d'informations, consultez modélisation de projet.