Udostępnij za pośrednictwem


Uwidacznianie obiektów projektu

Niestandardowe typy projektów mogą udostępniać obiekty automatyzacji w celu umożliwienia dostępu do projektu przy użyciu interfejsów automatyzacji. Oczekuje się, że każdy typ projektu zapewni standardowy Project obiekt automatyzacji, do którego uzyskuje się dostęp z Solutionprogramu , który zawiera kolekcję wszystkich projektów otwartych w środowisku IDE. Każdy element w projekcie powinien być uwidoczniony przez obiekt, do których ProjectItem uzyskuje Project.ProjectItemsdostęp . Oprócz tych standardowych obiektów automatyzacji projekty mogą oferować obiekty automatyzacji specyficzne dla projektu.

Można utworzyć niestandardowe obiekty automatyzacji na poziomie głównym, do których można uzyskać dostęp późno powiązany z głównym obiektem DTE za pomocą polecenia DTE.<customObjectName> lub DTE.GetObject("<customObjectName>"). Na przykład program Visual C++ tworzy kolekcję projektów specyficznych dla projektu C++ o nazwie VCProjects , do której można uzyskać dostęp przy użyciu polecenia DTE.VCProjects lub DTE.GetObject("VCProjects"). Można również utworzyć obiekt Project.Object, który jest unikatowy dla typu projektu, Project.CodeModel, który może być odpytywane dla jego najbardziej pochodnego obiektu i ProjectItem, który uwidacznia ProjectItem.Object i ProjectItem.FileCodeModel.

Jest to wspólna konwencja dla projektów, aby uwidocznić niestandardową kolekcję projektów specyficznych dla projektu. Na przykład program Visual C++ tworzy kolekcję projektów specyficznych dla języka C++, do której można uzyskać dostęp przy użyciu polecenia DTE.VCProjects lub DTE.GetObject("VCProjects"). Można również utworzyć obiekt Project.Object, który jest unikatowy dla typu projektu, Project.CodeModel, który może być odpytywane dla jego najbardziej pochodnego obiektu , ProjectItem, który uwidacznia ProjectItem.Objectelement i ProjectItem.FileCodeModel.

Aby współtworzyć obiekt specyficzny dla pakietu VSPackage dla projektu

  1. Dodaj odpowiednie klucze do pliku pkgdef pakietu VSPackage.

    Oto na przykład ustawienia pkgdef dla projektu języka C++:

    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation]
    "VCProjects"=""
    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents]
    "VCProjectEngineEventsObject"=""
    
  2. Zaimplementuj kod w metodzie GetAutomationObject , jak w poniższym przykładzie.

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

    W kodzie g_wszAutomationProjects jest nazwą kolekcji projektu. Metoda GetAutomationProjects tworzy obiekt, który implementuje Projects interfejs i zwraca IDispatch wskaźnik do obiektu wywołującego, jak pokazano w poniższym przykładzie kodu.

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

    Wybierz unikatową nazwę obiektu automatyzacji. Konflikty nazw są nieprzewidywalne, a kolizje powodują arbitralne wyrzucenie nazwy obiektu powodującego konflikt, jeśli wiele typów projektów używa tej samej nazwy. W nazwie obiektu automatyzacji należy uwzględnić nazwę firmową lub jakiś unikatowy aspekt jego nazwy produktu.

    Obiekt kolekcji niestandardowej Projects to wygodny punkt wejścia dla pozostałej części modelu automatyzacji projektu. Obiekt projektu jest również dostępny z Solution kolekcji projektu. Po utworzeniu odpowiedniego kodu i wpisów rejestru, które zapewniają użytkownikom Projects obiekty kolekcji, implementacja musi zapewnić pozostałe standardowe obiekty dla modelu projektu. Aby uzyskać więcej informacji, zobacz Modelowanie projektu.