Verfügbarmachen von Projektobjekten
Benutzerdefinierte Projekttypen können Automatisierungsobjekte bereitstellen, um den Zugriff auf das Projekt mithilfe von Automatisierungsschnittstellen zu ermöglichen. Jeder Projekttyp wird erwartet, dass das Standardautomatisierungsobjekt Project bereitgestellt wird, von Solutiondem aus zugegriffen wird, das eine Auflistung aller Projekte enthält, die in der IDE geöffnet sind. Jedes Element im Projekt wird voraussichtlich von einem ProjectItem Objekt verfügbar gemacht, auf Project.ProjectItems
das zugegriffen wird. Neben diesen Standardautomatisierungsobjekten können Projekte projektspezifische Automatisierungsobjekte anbieten.
Sie können benutzerdefinierte Automatisierungsobjekte auf Stammebene erstellen, auf die Sie über DTE.<customObjectName>
das DTE-Stammobjekt spät gebunden oder DTE.GetObject("<customObjectName>")
zugreifen können. Visual C++ erstellt z. B. eine C++-projektspezifische Projektsammlung namens VCProjects , auf die Sie zugreifen DTE.VCProjects
können, oder DTE.GetObject("VCProjects")
. Sie können auch ein Project.Object
für den Projekttyp eindeutiges , ein Project.CodeModel
, das für das am meisten abgeleitete Objekt abgefragt werden kann, und ein ProjectItem
, das verfügbar ProjectItem.Object
ist und eine ProjectItem.FileCodeModel
.
Es ist eine gängige Konvention für Projekte, um eine benutzerdefinierte projektspezifische Projektsammlung verfügbar zu machen. Visual C++ erstellt z. B. eine C++-spezifische Projektsammlung, auf die Sie dann mit DTE.VCProjects
oder zugreifen DTE.GetObject("VCProjects")
können. Sie können auch einen Project.Object
eindeutigen , für den Projekttyp, ein Project.CodeModel
, das für das am meisten abgeleitete Objekt abgefragt werden kann, ein ProjectItem
, das verfügbar ist ProjectItem.Object
, und eine ProjectItem.FileCodeModel
.
So tragen Sie ein VSPackage-spezifisches Objekt für ein Projekt bei
Fügen Sie die entsprechenden Schlüssel zur .pkgdef-Datei Ihres VSPackage hinzu.
Hier sind beispielsweise die Pkgdef-Einstellungen für das C++-Sprachprojekt:
[$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation] "VCProjects"="" [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents] "VCProjectEngineEventsObject"=""
Implementieren Sie den Code in der GetAutomationObject Methode, wie im folgenden Beispiel.
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; }
Im Code
g_wszAutomationProjects
ist der Name der Projektsammlung. DieGetAutomationProjects
Methode erstellt ein Objekt, das dieProjects
Schnittstelle implementiert und einenIDispatch
Zeiger auf das aufrufende Objekt zurückgibt, wie im folgenden Codebeispiel gezeigt.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); }
Wählen Sie einen eindeutigen Namen für Ihr Automatisierungsobjekt aus. Namenskonflikte sind unvorhersehbar, und Kollisionen führen dazu, dass ein konfliktierender Objektname willkürlich ausgelöst wird, wenn mehrere Projekttypen denselben Namen verwenden. Sie sollten Ihren Unternehmensnamen oder einen eindeutigen Aspekt des Produktnamens im Namen des Automatisierungsobjekts einschließen.
Das benutzerdefinierte
Projects
Auflistungsobjekt ist ein einfacher Einstiegspunkt für den neu Standard Teil des Projektautomatisierungsmodells. Auf Ihr Projektobjekt kann auch über die Solution Projektsammlung zugegriffen werden. Nachdem Sie die entsprechenden Code- und Registrierungseinträge erstellt haben, die VerbrauchernProjects
Sammlungsobjekte bereitstellen, muss Ihre Implementierung standardobjekte für das Projektmodell neu bereitstellen Standard. Weitere Informationen finden Sie unter Project-Modellierung.