Freigeben über


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.ProjectItemsdas 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.Objectfü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.Objecteindeutigen , 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

  1. 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"=""
    
  2. 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. 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.

    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 Verbrauchern Projects Sammlungsobjekte bereitstellen, muss Ihre Implementierung standardobjekte für das Projektmodell neu bereitstellen Standard. Weitere Informationen finden Sie unter Project-Modellierung.