Verfügbarmachen Projektobjekte
Visual Studio stellt eine dynamische Umgebung, in der VSPackages erweitert werden kann, um auf den Visual Studio-Automatisierungs Modells nahtlos beizutragen. Diese neuen Objekte erweitern das Automatisierungsmodell modell- DTE-Objekt.
Das DTE-Objekt ist der Hauptobjekt in Visual Studio-Automatisierungs Modells. Es befindet sich in der Hierarchie Visual Studio Automatisierungsobjekt.
Die Namen der VSPackage-Besondere Objekte werden in der Registrierung gespeichert, und der Code, der das Objekt erstellt und zurückgibt, ist ein Teil der VSPackage-Implementierung. Im folgenden Verfahren wird beschrieben, wie VSPackage-Besondere Objekte gefunden werden.
Die Startet Visual Studio der integrierten Entwicklungsumgebung (IDE).
Er liest alle Namen des Werts aus der Registrierung unter den Automatisierungs-, AutomationEvents- und AutomationProperties-Tasten aller VSPackages und speichert diese Namen in einer Tabelle.
Ein Automatisierungsmodell für GetObject-Methode oder die IDispatch::GetIDsOfNamesan und übergibt den Namen eines Objekts, wie im Folgenden dargestellt:
DTE.GetObject("VCProjects")
Die IDE durchsucht den Zeichenfolgenparameter in der Tabelle und lädt entsprechende VSPackage.
Die IDE ruft die Methode auf GetAutomationObject mit einem Namen wie „VCProjects“ verwendet, das im Aufruf übergeben wird.
VSPackage erstellt und gibt den IDispatch Zeiger des Objekts zurück. Wenn das Objekt bereits vorhanden ist, wird der Verweiszähler inkrementiert werden soll. In diesem Beispiel ist der Aufrufer übergebene Zurück ein Zeiger auf einen Standard- Projects-Auflistungsobjekt, das Festlegen von Visual C++ implementiert.
Das Objekt, das zurückgegeben wird, ist der Einstiegspunkt zum Verwenden des Rest die Automatisierungsobjekte eines Projekts.
Nachdem Sie ein bestimmtes Projects-Objekt erhalten, verwenden Sie die Item-Methode zum Abrufen eines Project-Objekt, das in ein Visual C++-Projekt entspricht. Nachdem Sie ein standardmäßiges Project-Objekt erhalten, rufen Sie das Object-Objekt auf, um auf ein projektspezifisches Objekt abzurufen. Das Objekt Object wird ein Objekt zurückgegeben, das das Project-Objekt erweitert, indem die eindeutigen Methoden und Eigenschaften verwendet. Sie können auch andere Objekte erstellt und zurückgegeben.
Die Namen der Automatisierungsobjekte, die Sie verfügbar machen möchten, werden als Namen von Zeichenfolgenwerten im folgenden Registrierungsschlüssel gespeichert:
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 8.0 \ Packages \ <PkgGUID> \ Automatisierung]
Hinweis
Der Text <PkgGUID> stellt das eigentliche GUID des VSPackage dar.
Das folgende Codebeispiel und die Registrierungseinträge typische Tabelle enthalten.
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 8.0 \ Packages \ <PkgGUID> \ Automatisierung]
@= ""
FigProjects „für " = " Abbildungen“
Name |
type |
Bereich |
Beschreibung |
---|---|---|---|
Standard (@) |
REG_SZ |
null |
Nicht verwendet. Sie können dies für Dokumentation verwenden. |
FigProjects |
REG_SZ |
Der Name des eindeutigen auflistungsobjekts Projekt. |
Nur der Schlüsselname ist relevant. Sie können das Datenfeld für Dokumentation verwenden. |
Alle VSPackages die neue Projekttypen enthalten, sollte Automatisierungsobjekte bereitstellen. Zum Beispiel wird Visual C++ VSPackage-Besondere Objekte, die von Add-Ins DTE.VCProjects oder DTE.GetObject(„“) aufrufen können VCProjects die von der Visual C++ von Projektobjekte Projects-Auflistung abzurufen. Projects und die darin enthaltenen Project-Elemente sind, die jedoch Implementierung Visual C++ folgen dem Normalprofil. Jedoch kann der Consumer an Project.Objectgelangen, der für den Projekttyp eindeutig ist, und kann seine eigenen eindeutigen Objekte bereitstellen. Ein Projektautomatisierungsmodell kann auch Project.CodeModelfür ein höchst-abgeleitetes Objekt (VCCodeModel) abgefragt werden kann.
Das gleiche Verfahren steht für ProjectItem, das auch ProjectItem.Objectauftaucht, und FileCodeModel.
Visual C++ VSPackage erstellt dann die Objekte, die für die Übergabe an den Automatisierung.
So fügen Sie ein VSPackage-Besondere Objekt für ein Projekt beitragen
Fügen Sie die entsprechenden Schlüssel den Registrierungseinstellungen von VSPackages hinzu.
Implementieren Sie den Code in GetAutomationObject der IVsPackage-Schnittstelle, die ein IDispatch-Objekt zurückgibt.
Im folgenden Codebeispiel wird eine Implementierung der GetAutomationObject-Methode veranschaulicht.
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; }
Im Code wird g_wszAutomationProjects den Namen der Projektauflistung. In diesem Beispiel ist dies FigProjects „,“ die Zeichenfolge, die unter <PkgGUID> \ Automatisierung Taste registriert ist (wie in Registrierungseinträgen gezeigt). Die GetAutomationProjects-Methode erstellt ein Objekt, das die Projects-Schnittstelle implementiert und einen IDispatch Zeiger auf das aufrufende Objekt zurückgibt, wie im folgenden Codebeispiel gezeigt.
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); }
Sie sollten einen eindeutigen Namen für das Automatisierungsobjekt auswählen. Namenskonflikte sind unvorhersehbar und Konflikten führen, Objektnamen in Konflikt stehenden einen willkürlich Bereichs ausgelöst wird, wenn mehrere VSPackages-Verwendung, die mit dem gleichen Namen. Um solche Konflikte zu vermeiden, wird empfohlen, dass Sie die Gesellschaftsfirma oder einen Aspekt seines eindeutigen Namen in das Feld Titel des Automatisierungsobjekts Produkt einschließen.
Das Projects-Auflistungsobjekt ist der Einstiegspunkt für den Rest des Projekts automatisierungs modells. Nachdem Sie den entsprechenden Code und die Registrierungseinträge erstellt haben, die Projects Consumer mit Auflistungsobjekten zu gewährleisten, muss Ihre Implementierung verbleibenden Standardwert Objekte zum Projektmodell bereitstellen. Weitere Informationen finden Sie unter Projekt-Modellierung.